#r #dataframe #na
#r #фрейм данных #na
Вопрос:
У меня есть фрейм данных, который является результатом объединения нескольких листов из Excel. Столбцы не выровнены должным образом. Мне нужно проверить, все ли подмножества строк являются NA. Если они NA, то мне нужно проверить, есть ли содержимое в соседнем подмножестве одинакового размера, и если есть, мне нужно скопировать эту строку, чтобы заменить NAs.
Вот как выглядят данные из моего dput:
structure(list(id = 1:20, A = c(NA, NA, NA, NA, NA, "c", "d",
"q", "p", "m", NA, NA, NA, NA, NA, "k", "o", "i", "a", "b"),
B = c(NA, NA, NA, NA, NA, "h", "a", "f", "b", "e", NA, NA,
NA, NA, NA, "m", "c", "s", "g", "p"), C = c(NA, NA, NA, NA,
NA, "a", "f", "j", "s", "g", NA, NA, NA, NA, NA, "l", "m",
"o", "k", "t"), D = c(NA, NA, NA, NA, NA, "n", "r", "l",
"h", "g", NA, NA, NA, NA, NA, "j", "p", "f", "d", "q"), E = c("j",
"p", "n", "i", "g", NA, NA, NA, NA, NA, "k", "e", "s", "m",
"l", NA, NA, NA, NA, NA), F = c("o", "d", "r", "q", "a",
NA, NA, NA, NA, NA, "h", "s", "f", "j", "k", NA, NA, NA,
NA, NA), G = c("f", "c", "a", "l", "m", NA, NA, NA, NA, NA,
"n", "t", "s", "e", "r", NA, NA, NA, NA, NA), H = c("r",
"c", "h", "i", "j", NA, NA, NA, NA, NA, "f", "e", "b", "l",
"n", NA, NA, NA, NA, NA)), row.names = c(NA, -20L), class = "data.frame")
Ответ №1:
Если у вас одинаковое количество не пропущенных значений в каждой строке, как показано в общем примере, вы можете удалить NA
значения в каждой строке.
df1 <- as.data.frame(t(apply(df, 1, na.omit)))
# V1 V2 V3 V4 V5
#1 1 j o f r
#2 2 p d c c
#3 3 n r a h
#4 4 i q l i
#5 5 g a m j
#6 6 c h a n
#7 7 d a f r
#8 8 q f j l
#9 9 p b s h
#10 10 m e g g
#11 11 k h n f
#12 12 e s t e
#13 13 s f s b
#14 14 m j e l
#15 15 l k r n
#16 16 k m l j
#17 17 o c m p
#18 18 i s o f
#19 19 a g k d
#20 20 b p t q
Чтобы проверить наличие значений 1-й половины, и если все они есть NA
, мы выбираем вторую половину, мы можем сделать :
cbind(df[1], t(apply(df[-1], 1, function(x) {
x1 <- (length(x)/2)
if(all(is.na(x[1:x1]))) x[(x1 1):length(x)]
else x[1:x1]
})))
Комментарии:
1. Не всегда будет одинаковое количество не пропущенных значений. Но если первые 4 значения в строке отсутствуют, тогда я знаю, что мне нужно скопировать соседние 4 значения.
2. Не могли бы вы поделиться таким примером? Также, что будет выведено в таком случае? Допустим, 1-я строка имеет 4 не пропущенных значения, а вторая строка for имеет 5 не пропущенных значений. Будет ли у вас 1
NA
значение в 1-й строке?3. @ Ronak Shah Если первые 4 значения в строке равны NA, а из соседних 4 значений в той же строке имеют 3 значения, тогда 1 значение будет NA. Я хочу переместить последние 4 столбца в первые 4 столбца, только если первые 4 значения равны NA. К сожалению, я не могу поделиться данными.
4. Обновление удаляет весь столбец. Я собираюсь посмотреть, что еще особенного в наборе данных, а затем прокомментирую.