2

如何确定列值是否相等?

示例数据框:

 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

4 回答 4

4

这有点复杂,因为您的元素实际上并不相等:它们是NA,所以我们不知道它们的值是什么。在 R(以及大多数/所有其他编程语言)中,NANA.

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

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

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

df$F = apply(df[, 2 : 5], 1, all_equal)
于 2017-04-12T17:01:26.930 回答
3

你可以这样使用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
于 2017-04-12T17:21:58.247 回答
2

或者这个可能:

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
于 2017-04-12T18:21:11.223 回答
1
## 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
于 2017-04-12T17:01:24.620 回答