R中的条件和 - 多列

时间:2017-10-28 18:13:38

标签: r dataframe sum dplyr conditional

我试图弄清楚如何从非常大的表格中提取某些特定信息(例如,30&#39,000行和50列)。

想象一下,我有这个数据框:

{{1}}

我需要的是对列进行总结" count"例如,当S1和S3共享相同的值时(它与哪个值无关),但没有其他列具有相同的值。

在这个例子中,它应该返回值11,因为我只应该考虑列的值" count"从第1行和第4行开始。

在第2行,第5行和第6行中,S1和S3具有相似的值,但我不想考虑它们,因为还有其他列具有相同的值。最后,不考虑第3行只是因为S1和S3具有不同的值。

我知道如何在excel中轻松完成,但我想知道如何在R中完成它。我已经尝试过dplyr的somme命令,但我失败了。

如果你们中的任何人能够提供帮助,我将非常感激。

3 个答案:

答案 0 :(得分:1)

使用dplyr的解决方案。有两个步骤。第一个filter函数查找S1 == S3行。第二个filter_at函数检查S1S3count以外的列均不等于S1S3应与{{1}相同在第一个filter函数之后。

library(dplyr)

df2 <- df %>%
  filter(S1 == S3) %>%
  filter_at(vars(-S1, -S3, -count), all_vars(. != S1))
df2
  count S1 S2 S3 S4 S5
1    10  1  2  1  3  3
2     1  1  2  1  2  3

然后总计数如下。

sum(df2$count)
[1] 11

答案 1 :(得分:1)

使用dplyrrowwisefilter

library(dplyr)
df %>% rowwise %>% filter(S1==S3 & !S1 %in% c(S2,S4,S5)) %>% pull(count) %>% sum
# [1] 11

答案 2 :(得分:1)

稍微复杂一点,但它确实有效。仅使用R base。从this question开始,采用以简单方式比较多个列的形式。

sum(df[df$S1==df$S3 & rowSums(sapply(df[,c(3,5,6)],`==`,e2=df$S1)) == 0,1])

[1] 11

最复杂的部分是如何检查多列。在这种情况下,我们使用sapply将列c(3,5,6)与等式('==')与S1进行比较,(e2==函数的第二个参数)

正如ycw所提到的,用向量定义所有列可能有点复杂,因此这个表单允许您检查除我们不想要的那些列之外的所有列。

sum(df[df$S1==df$S3 & rowSums(sapply(df[,!(colnames(df) %in% c("count", "S1", "S3"))],`==`,e2=df$S1)) == 0,1])

对两个比较应用相同的过程并仅定义相同值的向量:

equals <- c("S1", "S3")
not_equals <- !(colnames(df) %in% c("count", equals))

sum(df[rowSums(sapply(df[,equals,drop=FALSE],`==`,e2=df[equals[1]])) == length(equals) &
           rowSums(sapply(df[,not_equals,drop=FALSE],`==`,e2=df[equals[1]])) == 0, 1])

注意:使用drop=FALSE仅选择一列数据框,并避免&#34;升级为向量&#34;问题或以这种方式省略,

sum(df[rowSums(sapply(df[equals],`==`,e2=df[equals[1]])) == length(equals) &
           rowSums(sapply(df[not_equals],`==`,e2=df[equals[1]])) == 0, 1])