R 中的列相等

Columns Equal in 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
## 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

有点复杂,因为你的元素实际上不相等:它们是NA,所以我们不知道它们的值是多少。在 R(和 most/all 其他编程语言)中,NANA.

因此我们需要分别测试 (a) 值是否全部 NA 或 (b) 并非全部 NA 和 (c) 全部相等。这在 R 中变得令人费解,并且在 R 中有简洁的(如果是间接的)快捷方式。Frank 的评论提到了其中之一:

all_equal = function (x) {
    length(unique(x)) == 1L
}

现在我们可以将此函数应用于您的列 2 : 5 并将其分配给新列,F:

df$F = apply(df[, 2 : 5], 1, all_equal)

您可以像这样使用 rowSumsis.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

或者这个可能是:

df$F <- apply(is.na(df)[,-1], 1, all)

OR(如果一行中的所有值都是TRUE,则mean值为1)

df$F <- rowMeans(is.na(df)[,-1])==1

OR(如果一行中的所有值都相等,则方差为0)

df$F <- apply(is.na(df)[,-1], 1, var)==0