R子集行,其中多列中的值不匹配

时间:2016-11-08 19:06:07

标签: 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,]

提前致谢。

2 个答案:

答案 0 :(得分:1)

数据框通常按列而不是按行进行操作,这就是为什么duplicated尝试不起作用的原因。 (它正在检查这些列中的重复行。)并且==不起作用,因为==是二元运算符,df$A == df$B将为TRUE或FALSE,然后{{1}如果(df$A == df$B) == df$C为TRUE或FALSE,则(隐含的括号)将进行测试。

df$C是在每个上运行函数的好方法。它会将您的数据帧转换为矩阵以运行该函数,但在这种情况下,精细列A到E都是数字。这是一种方式:

apply

您可以为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 提供各种不同的功能,以测试所有元素是否相同。

我假设您实际上有一个名为apply的列。如果不是这种情况,请忽略上面代码中的Row

使用此数据,可与-1重复共享。

dput()

答案 1 :(得分:1)

您可以简单地将所有列与单个列进行比较,并查看是否所有相同的

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[rowSums(df == df[, 1]) < (ncol(df)), ]

或者类似地,您可以一起避免矩阵转换并合并Reducelapply

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