如何确定列值是否相等?
示例数据框:
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
答案 0 :(得分:4)
这有点复杂,因为你的元素实际上不是:它们是NA
,所以我们不知道它们的价值是什么。在R(以及大多数/所有其他编程语言)中,NA
≠NA
。
因此,我们需要单独测试(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)
您可以像这样使用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
答案 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