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   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/

相关文章:

r - 根据 R 中的另一个数据帧创建一个新数据帧

r - 带协变量的时间序列分析

r - LME 模型中第 0 级、第 1 block 的反求解奇异性

r - 小升级后从 R 路径中删除本地库路径

正则表达式:如何从最后一个括号中提取文本

r - 将一个主题的观察结果合并到所有其他主题中

r - 如何编写 Median 函数以用于 Ggplot 图,以适应 R 数据集中的不同项目

r - 访问 Twitter API 时需要授权错误

r - 带有子组的组的反向引用编号

r - 如何将 pivot_longer 与 name_pattern 一起使用