【问题标题】:Referencing a range of columns in dplyr引用 dplyr 中的一系列列
【发布时间】:2016-10-11 12:33:44
【问题描述】:

假设我有一个这样的数据框df

    txt    A1    A2    B1    B2
1   ala    6      9    12    23
2   ata    1      3    3     11
....

我想使用dplyr 根据一系列变量的总和过滤行。 我试过了:

filter(df, sum(A2:B1)>10)

....但它不起作用。

有人可以在dplyr 中提出解决方案吗?是的,我知道它可以通过简单的子集来完成。

【问题讨论】:

  • filter(df, A2+B1>10)?
  • 我知道在这种特殊情况下,您可以简单地将两者相加,但想象一下我在该范围内有数十列
  • 是的,我就是这么想的……
  • 您要查找的函数是 rowSums 在这种情况下,rowSums(df[,3:4]) 可以解决问题

标签: r filter sum dplyr


【解决方案1】:

我认为最dplyr-esque 的方式是:

df %>%
  filter(rowSums(select_(., 'A2:B1')) > 10)

这给出了:

#  txt A1 A2 B1 B2
#1 ala  6  9 12 23

【讨论】:

  • 还有一个问题。不打底可以吗?
  • @kwicher 试试filter(df, rowSums(select_(df, 'A2:B1')) > 10)
  • @kwicher 很高兴它有帮助
  • select_() 已弃用。使用filter(rowSums(select(., A2:B1)) > 10) 注意没有下划线和没有引号的列。
【解决方案2】:

我们可以先获取索引,然后使用rowSums,

v1 <- which(names(df) == 'A2') #find first column
#[1] 3
v2 <- which(names(df) == 'B1') #find last column
#[1] 4
df[rowSums(df[v1:v2])>10,]
#  txt A1 A2 B1 B2
#1 ala  6  9 12 23

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2020-09-21
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2015-07-15
    • 2020-06-19
    • 2017-03-21
    相关资源
    最近更新 更多