Столбцы Равные в R
Как определить, равны ли значения столбцов?
Примерный фрейм данных:
A B C D E
ab NA NA NA NA
ed dd NA NA NA
ll NA NA NA NA
dd NA NA ef NA
Как определить из столбцов 2:5, все ли они содержат NA?
Я хочу, чтобы мой окончательный кадр данных выглядел так:
A B C D E F
ab NA NA NA NA TRUE
ed dd NA NA NA FALSE
ll NA NA NA NA TRUE
dd NA NA ef NA FALSE
4 ответа
Ты можешь использовать rowSums
а также is.na
вот так:
df1 = read.table(text=" A B C D E
ab NA NA NA NA
ed dd NA NA NA
ll NA NA NA NA
dd NA NA ef NA
", header=T, stringsAsFactors=F)
df1$F <- rowSums(!is.na(df1[,2:5]))==0
df1
A B C D E F
1 ab <NA> NA <NA> NA TRUE
2 ed dd NA <NA> NA FALSE
3 ll <NA> NA <NA> NA TRUE
4 dd <NA> NA ef NA FALSE
Это немного сложно, потому что ваши элементы на самом деле не равны: они NA
поэтому мы не знаем, какова их ценность. В R (и большинство / все другие языки программирования), NA
≠ NA
,
Таким образом, мы должны отдельно проверить, являются ли (а) все значения NA
или (б) не все NA
и (в) все равны. Это становится запутанным в R, и в комментарии Р. Фрэнка упоминаются аккуратные, хотя и косвенные, ярлыки:
all_equal = function (x) {
length(unique(x)) == 1L
}
И теперь мы можем применить эту функцию к вашим столбцам 2: 5 и назначить ее для нового столбца, F
:
df$F = apply(df[, 2 : 5], 1, all_equal)
Или этот может быть:
df$F <- apply(is.na(df)[,-1], 1, all)
ИЛИ (если все значения в строке TRUE
, mean
значение 1)
df$F <- rowMeans(is.na(df)[,-1])==1
ИЛИ (если все значения в строке равны, дисперсия равна 0)
df$F <- apply(is.na(df)[,-1], 1, var)==0
## simulating a data frane
set.seet(1984)
df <- data.frame( A = sample(c(1,NA), 10,c(.1,.9), replace = T) ,
B = sample(c(1,NA), 10,c(.2,.8), replace = T),
C = sample(c(1,NA), 10,c(.3,.7), replace = T),
D = sample(c(1,NA), 10,c(.4,.6), replace = T),
E = rep(NA,10))
df
A B C D E
1 NA NA 1 NA NA
2 NA NA NA 1 NA
3 1 NA NA 1 NA
4 NA NA NA NA NA
5 NA NA NA NA NA
6 NA NA NA NA NA
7 NA NA NA 1 NA
8 NA NA NA 1 NA
9 NA NA NA NA NA
10 NA NA NA 1 NA
## count the NULL's for each column
sapply(df, function(x) sum(is.na(x)))
A B C D E
9 10 9 5 10
## count the NULL's in each row
apply(df, 1, function(x) sum(is.na(x)))
[1] 4 4 3 5 5 5 4 4 5 4