如果已经有人问过这个问题,我深表歉意,但我进行了搜索,但找不到我正在尝试做的事情的确切示例。我正在尝试对数据框进行子集化,以排除在五列中具有匹配数值的行。例如,对于以下数据帧 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 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 <- df[df$A==df$B==df$C==df$D==df$E,]
提前致谢。
最佳答案
数据框通常按列而不是按行操作,这就是您的重复
尝试不起作用的原因。 (它正在检查这些列中的重复行。)并且您的 ==
不起作用,因为 ==
是二元运算符,df$A == df $B
将为 TRUE 或 FALSE,然后 (df$A == df$B) == df$C
(隐含括号)将测试 df$C
是 TRUE 或 FALSE。
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
您可以想出各种不同的函数来应用
来测试所有元素是否相同。
我假设您实际上有一个名为 Row
的列。如果情况并非如此,请忽略上面代码中的 -1
。
使用此数据,与 dput()
重复共享。
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))
关于R 对多列中的值不匹配的行进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40494595/