在创建计算列时,如何使用dplyr对列进行求和?

时间:2016-03-31 22:58:24

标签: r dplyr

我有一个名为df的数据框,看起来像这样

GENDER,CHOCOLATE,VANILLA,...A_BUNCH_OF_COLUMNS_HERE...,ORANGUTAN
M,11,22,...,33
F,22,33,...,44
M,22,11,...,22
F,44,55,...,66

我想制作一个名为PERCENTAGE_ORANGUTAN的新列,其计算方式为ORANGUTAN / SUM(previous_columns)

如果我知道dplyr 之前的列名称,我知道如何使用ORANGUTAN 创建计算列。但如果我不知道ORANGUTAN之前的列名称或列数,我该如何计算PERCENTAGE_ORANGUTAN?或者没有dplyr

2 个答案:

答案 0 :(得分:4)

可能会有更多" dplyr-ish"习惯用法,但如果您知道在ORANGUTAN列之前需要所有列,则可以使用match来选择它们。例如,使用内置的mtcars数据框:

mtcars %>% 
   mutate(pct = wt/rowSums(.[ , 1:(match("wt", names(.))-1)]))

上面的代码通过将pct列除以它前面的所有列的总和(这是非感性的并且仅用于说明)来创建名为wt的新列。

.是一个"代词"指的是mtcars数据框。

我们希望第1列的总和通过wt之前的列。 match返回wt列名称向量中mtcars的数字索引。该值恰好为6,因此我们从中减去1得到第1列到第5列的总和。

答案 1 :(得分:0)

在基地:

首先,我们将删除所有非数字的列:

df1 <- df[,sapply(df, is.numeric)]

然后由索引大于&#39; ORANGUTAN&#39;的那些子集,并除以:

df$new <- df1$ORANGUTAN / rowSums(df1[ , 1:which(names(df1) == 'ORANGUTAN')])

,并提供:

[1] 0.5000000 0.4444444 0.4000000 0.4000000

数据:

df = read.table(text = "GENDER,CHOCOLATE,VANILLA,ORANGUTAN
M,11,22,33
F,22,33,44
M,22,11,22
F,44,55,66", sep = ',', header = TRUE)