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

时间:2017-12-11 18:44:22

标签: r dplyr tidyverse

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

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

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

4 个答案:

答案 0 :(得分:12)

我同意MrFlick的说法,整理你的数据是可取的---特别是如果你想做任何而不是总结这些列---但这里有一个选项:

                    CTHyperlink cLink = paragraph.getCTP().insertNewHyperlink(0);

                    cLink.setId(id);

                    //Create the linked text
                    CTText ctText=CTText.Factory.newInstance();
                    ctText.setStringValue("this is a inserted link");
                    CTR ctr=CTR.Factory.newInstance();
                    ctr.setTArray(new CTText[]{ctText});

                    CTRPr rpr = ctr.addNewRPr();

                    rpr.set(paragraph.getRuns().get(i).getCTR().getRPr());

                    CTString string = rpr.addNewRStyle();
                    string.setVal("Hyperlink");

                    //Insert the linked text into the link
                    cLink.setRArray(new CTR[]{ctr});

                    paragraph.insertNewHyperlinkRun(0, cLink);

请参阅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 ... 以外的?select辅助选项以选择列。

答案 1 :(得分:2)

iris %>% mutate(Petal = rowSums(.[grep("Petal", names(.))], na.rm = T))

这应该有效。

names(.)从数据框中选择名称,grep在名称中进行搜索以找到与正则表达式(“ Petal”)匹配的名称,rowSums将每一列的值相加,并赋值将它们添加到新变量Petal中。 “。[]”语法是dplyr传递列名的一种变通方法。

答案 2 :(得分:1)

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

select

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

答案 3 :(得分:0)

使用reduce()中的purrrrowSums快一点,并且绝对比apply快,因为您可以避免遍历所有行,而只是利用矢量化操作:

library(purrr)
library(dplyr)
iris %>% mutate(Petal = reduce(select(., starts_with("Petal")), `+`))

有关时间,请参见this