У меня есть следующий фрейм данных dat
, в котором в начале некоторых строк представлено количество NA для конкретной строки:
dat <- as.data.frame(rbind(c(NA,NA,1,3,5,NA,NA,NA), c(NA,1:3,6:8,NA), c(1:7,NA)))
dat
# V1 V2 V3 V4 V5 V6 V7 V8
# NA NA 1 3 5 NA NA NA
# NA 1 2 3 6 7 8 NA
# 1 NA 2 3 4 5 6 NA
Моя цель - удалить все NA в начале каждой строки и сдвинуть значения строк влево (добавив соответственно NA в конце смещенных строк, чтобы сохранить их длину постоянной).
Следующий код работает должным образом:
for (i in 1:nrow(dat)) {
if (is.na(dat[i,1])==TRUE) {
dat1 <- dat[i, min(which(!is.na(dat[i,]))):length(dat[i,])]
dat[i,] <- data.frame( dat1, t(rep(NA, ncol(dat)-length(dat1))) )
}
}
dat
возвращение:
# V1 V2 V3 V4 V5 V6 V7 V8
# 1 3 5 NA NA NA NA NA
# 1 2 3 6 7 8 NA NA
# 1 NA 2 3 4 5 6 NA
Мне было интересно, есть ли более прямой способ сделать это без использования цикла for и с помощью функции tail
.
Что касается этого последнего пункта, при использовании min(which(!is.na(dat[1,])))
результат будет 3
, как и ожидалось. Но затем, если я наберу tail(dat[1,],min(which(!is.na(dat[1,]))))
, результатом будет та же самая начальная строка, и я не понимаю, почему ...
Большое спасибо за предложение Ану.
NA
, в каждой строке сортируются в порядке возрастания слева направо? Или это то, что вы пытаетесь сделать (всеNA
s справа)? - person talat   schedule 14.05.2014