R 检查一列与其他列的 rowSums 的相等性

R check equality of one column to rowSums of other columns

提问人:xiaochuan fang 提问时间:8/7/2022 更新时间:8/7/2022 访问量:67

问:

我有一个这样的数据帧:

x y 1倍 一年级 2倍 二年级 x3的 三年级
1 0 1 0 0 0 0 0
0 0 3 0 0 0 0 0
2 0 0 0 0 0 2 0
1 0 0 0 1 0 0 0

我想找到 x=x1+x2+x3 的行和 y=y1+y2+y3 的行。 这是我检查 x=x1+x2+x3 的代码:

col_x = c(3,5,7)
df[df$x == rowSums(df[col_x])]

假设返回行 1,3,4,但它返回

  x x1 y1 x2 x3 y3
1 1  1  0  0  0  0
2 0  3  0  0  0  0
3 2  0  0  0  2  0
4 1  0  0  1  0  0

我也试过了

col_x = c(3,5,7)
df[df$x == apply(df[col_x],1,sum)]

这也给了我:

  x x1 y1 x2 x3 y3
1 1  1  0  0  0  0
2 0  3  0  0  0  0
3 2  0  0  0  2  0
4 1  0  0  1  0  0

我无法弄清楚为什么它返回了所有行并且它跳过了 y2 列。

R 相等 行和

评论


答:

1赞 PaulS 8/7/2022 #1

可能的解决方案:

library(dplyr)

df %>% 
  filter(x == rowSums(across(matches("x\\d$"))) &
    y == rowSums(across(matches("y\\d$"))))

#>   x y x1 y1 x2 y2 x3 y3
#> 1 1 0  1  0  0  0  0  0
#> 2 2 0  0  0  0  0  2  0
#> 3 1 0  0  0  1  0  0  0

评论

1赞 xiaochuan fang 8/7/2022
这也是一个很好的解决方法!
1赞 stomper 8/7/2022 #2

你只是缺少一个逗号。

col_x = c(3,5,7)
df[df$x == rowSums(df[col_x]),]

  x y x1 y1 x2 y2 x3 y3
1 1 0  1  0  0  0  0  0
3 2 0  0  0  0  0  2  0
4 1 0  0  0  1  0  0  0

评论

0赞 xiaochuan fang 8/7/2022
我简直不敢相信这是正确的答案!