R中的列相等

时间:2017-04-12 16:52:10

标签: r na rowsum

如何确定列值是否相等?

示例数据框:

 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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:2)

或者这个可能:

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

答案 3 :(得分: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