我有一个名为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
?
答案 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)