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 其他编程语言)中,NA
≠ NA
.
因此我们需要分别测试 (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)
您可以像这样使用 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
或者这个可能是:
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
如何确定列值是否相等?
示例数据框:
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 其他编程语言)中,NA
≠ NA
.
因此我们需要分别测试 (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)
您可以像这样使用 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
或者这个可能是:
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