首页 文章

创建一个新列,它是dplyr中特定列(由其名称选择)的总和

提问于
浏览
2

我的问题是如何创建一个新列,它是dplyr中某些特定列(由其名称选择)的总和 . 例如,使用iris数据集,我创建一个名为Petal的新列,它是Petal.Length和Petal.Width的总和 .

iris %>% mutate(Petal = Petal.Length+Petal.Width)

现在假设我有一个20列的数据集,其名称中包含'Petal' . 我想创建一个“Petal”列,它总结了所有这些列 . 我绝对不想在我的代码中键入所有列名称 . 感觉在dplyr中应该有一行代码可以实现 . 感谢是否有人可以提供帮助 .

2 回答

  • 1

    我同意MrFlick的说法,整理你的数据是可取的 - 特别是如果你想做除了这些列之外的任何事情 - 但这里有一个选择:

    iris %>% mutate(
       Petal = rowSums(select(., starts_with("Petal")))
    )
    
        Sepal.Length Sepal.Width Petal.Length Petal.Width    Species Petal
    1            5.1         3.5          1.4         0.2     setosa   1.6
    2            4.9         3.0          1.4         0.2     setosa   1.6
    3            4.7         3.2          1.3         0.2     setosa   1.5
    4            4.6         3.1          1.5         0.2     setosa   1.7
    5            5.0         3.6          1.4         0.2     setosa   1.6
    ...
    

    有关选择列的信息,请参阅 starts_with() 以外的 ?select 辅助选项 .

  • 9

    更一般地,为每个观察创建一个键(例如,使用下面的 mutate 的行号),将感兴趣的列移动到两列中,一列保存列名,另一列保存值(使用下面的 melt ), group_by 观察,以及做你想做的任何计算 . 下面,我使用 mutate 添加一列,该列对包含单词'Petal'的所有列进行求和,最后删除我不想要的任何变量(使用 select ) .

    require(dplyr)
    require(reshape2)
    
    iris %>%
      mutate(observation = 1:nrow(iris)) %>% 
      melt(
        measure.vars = grep("Petal", colnames(iris)), 
        variable.name = 'variable', 
        value.name = 'value') %>% 
      group_by(observation) %>%
      mutate(Petal = sum(value)) %>% 
      select(-observation, -variable, -value)
    

    虽然可以缩短上述内容,但我认为这个版本会提供一些指导 .

相关问题