Столбцы Равные в 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 (и большинство / все другие языки программирования), NANA,

Таким образом, мы должны отдельно проверить, являются ли (а) все значения 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
Другие вопросы по тегам