如果已经问过这个问题,请道歉,但我搜索过,找不到我想要做的确切示例。我正在尝试对数据框进行子集化,以排除在五列中具有匹配数值的行。例如,对于以下数据帧,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,]
提前致谢。
答案 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)), ]
或者类似地,您可以一起避免矩阵转换并合并Reduce
和lapply
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