我的问题是如何创建一个新列,它是dplyr中某些特定列(由其名称选择)的总和。 例如,使用iris数据集,我创建一个名为Petal的新列,它是Petal.Length和Petal.Width的总和。
iris %>% mutate(Petal = Petal.Length+Petal.Width)
现在想象一下,我的数据集中有20个列,其名称中包含“Petal”。我想创建一个“Petal”列,它总结了所有这些列。我绝对不想在我的代码中键入所有列名称。感觉在dplyr中应该有一行代码可以实现。 感谢是否有人可以提供帮助。
答案 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()
中的purrr
比rowSums
快一点,并且绝对比apply
快,因为您可以避免遍历所有行,而只是利用矢量化操作:
library(purrr)
library(dplyr)
iris %>% mutate(Petal = reduce(select(., starts_with("Petal")), `+`))
有关时间,请参见this