R子集行,其中多列中的值不';不匹配
如果已经有人问过我,我表示歉意,但是我搜索了一下,没有找到一个确切的例子来说明我正在尝试做什么。我试图对数据帧进行子集划分,以排除在五列中具有匹配数值的行。例如,对于下面的数据帧df,我只想返回一个包含第1:2、5:6和8:10行的新数据帧:R子集行,其中多列中的值不';不匹配,r,R,如果已经有人问过我,我表示歉意,但是我搜索了一下,没有找到一个确切的例子来说明我正在尝试做什么。我试图对数据帧进行子集划分,以排除在五列中具有匹配数值的行。例如,对于下面的数据帧df,我只想返回一个包含第1:2、5:6和8:10行的新数据帧: Row A B C D E 1 1 1 2 3 1 2 4 1 2 3 5 3 2 2 2 2 2 4 5 5 5 5 5 5 4 4 2 3
Row A B C D E
1 1 1 2 3 1
2 4 1 2 3 5
3 2 2 2 2 2
4 5 5 5 5 5
5 4 4 2 3 4
6 2 1 3 5 2
7 3 3 3 3 3
8 3 2 5 3 3
9 2 1 2 2 4
10 3 3 3 2 3
我在两个以上的专栏中都很难找到这样做的方法。我试过以下方法,知道它们不对
df2 <- df[!duplicated(df, c("A", "B", "C", "D", "E"))]
df2数据帧通常是按列而不是按行操作的,这就是为什么您的duplicated
尝试不起作用的原因。(它正在检查这些列中的重复行。)而您的==
不起作用,因为=
是一个二进制运算符,df$a==df$B
将为真或假,然后(df$a==df$B)==df$C
(隐含括号)将测试df$C
是真还是假
apply
是在每行上运行函数的好方法。它会将您的数据帧转换为一个矩阵来运行函数,但在这种情况下,a到E列都是数字。这里有一个方法:
df[apply(df[, -1], 1, function(x) length(unique(x))) > 1, ]
# Row A B C D E
# 1 1 1 1 2 3 1
# 2 2 4 1 2 3 5
# 5 5 4 4 2 3 4
# 6 6 2 1 3 5 2
# 8 8 3 2 5 3 3
# 9 9 2 1 2 2 4
# 10 10 3 3 3 2 3
您可以使用各种不同的函数来应用
,以测试所有元素是否相同
我假设您实际上有一个名为行的列。如果不是这样,请在上面的代码中省略-1
使用此数据,可与
dput()
重复共享
您可以简单地将所有列与单个列进行比较,看看是否都相同
df[rowSums(df[-1] == df[, 1]) < (ncol(df) - 1), ]
# A B C D E
# 1 1 1 2 3 1
# 2 4 1 2 3 5
# 5 4 4 2 3 4
# 6 2 1 3 5 2
# 8 3 2 5 3 3
# 9 2 1 2 2 4
# 10 3 3 3 2 3
非常感谢。这正是我所需要的。
df = structure(list(Row = 1:10, A = c(1L, 4L, 2L, 5L, 4L, 2L, 3L,
3L, 2L, 3L), B = c(1L, 1L, 2L, 5L, 4L, 1L, 3L, 2L, 1L, 3L), C = c(2L,
2L, 2L, 5L, 2L, 3L, 3L, 5L, 2L, 3L), D = c(3L, 3L, 2L, 5L, 3L,
5L, 3L, 3L, 2L, 2L), E = c(1L, 5L, 2L, 5L, 4L, 2L, 3L, 3L, 4L,
3L)), .Names = c("Row", "A", "B", "C", "D", "E"), class = "data.frame", row.names = c(NA,
-10L))
df[rowSums(df[-1] == df[, 1]) < (ncol(df) - 1), ]
# A B C D E
# 1 1 1 2 3 1
# 2 4 1 2 3 5
# 5 4 4 2 3 4
# 6 2 1 3 5 2
# 8 3 2 5 3 3
# 9 2 1 2 2 4
# 10 3 3 3 2 3
df[!Reduce("&" , lapply(df, `==`, df[, 1])), ]
# A B C D E
# 1 1 1 2 3 1
# 2 4 1 2 3 5
# 5 4 4 2 3 4
# 6 2 1 3 5 2
# 8 3 2 5 3 3
# 9 2 1 2 2 4
# 10 3 3 3 2 3