我很难描述这个,所以最好用一个例子来解释(可能从糟糕的问题标题中可以看出)。
使用dplyr我有一个group_by
和summarize
的结果我有一个数据框,我想通过因子做一些进一步的操作。
作为一个例子,这里的数据框看起来像我的dplyr操作的结果:
> df <- data.frame(run=as.factor(c(rep(1,3), rep(2,3))),
group=as.factor(rep(c("a","b","c"),2)),
sum=c(1,8,34,2,7,33))
> df
run group sum
1 1 a 1
2 1 b 8
3 1 c 34
4 2 a 2
5 2 b 7
6 2 c 33
我想将sum
除以取决于run
的值。例如,如果我有:
> total <- data.frame(run=as.factor(c(1,2)),
total=c(45,47))
> total
run total
1 1 45
2 2 47
然后我的最终数据框将如下所示:
> df
run group sum percent
1 1 a 1 1/45
2 1 b 8 8/45
3 1 c 34 34/45
4 2 a 2 2/47
5 2 b 7 7/47
6 2 c 33 33/47
我手动在percent
列中手动插入分数以显示我想要执行的操作。
我知道可能有一些dplyr方法可以用mutate
执行此操作,但我现在似乎无法解决这个问题。这将如何实现?
答案 0 :(得分:4)
(在基地R)
您可以使用total
作为查找表,在每次查看df
时获得总计:
total[df$run,'total']
[1] 45 45 45 47 47 47
您只需使用它来划分总和并将结果分配给新列:
df$percent <- df$sum / total[df$run,'total']
run group sum percent
1 1 a 1 0.02222222
2 1 b 8 0.17777778
3 1 c 34 0.75555556
4 2 a 2 0.04255319
5 2 b 7 0.14893617
6 2 c 33 0.70212766
答案 1 :(得分:1)
如果你的&#34;运行&#34;值为1,2 ... n然后这将起作用
divisor <- c(45,47) # c(45,47,...up to n divisors)
df$percent <- df$sum/divisor[df$run]
答案 2 :(得分:0)
首先要将总值合并到df中:
df2 <- merge(df, total, by = "run")
然后你可以调用mutate:
df2 %<>% mutate(percent = sum / total)
答案 3 :(得分:0)
就地转换为data.table
,然后合并并再次添加新列:
library(data.table)
setDT(df)[total, on = 'run', percent := sum/total]
df
# run group sum percent
#1: 1 a 1 0.02222222
#2: 1 b 8 0.17777778
#3: 1 c 34 0.75555556
#4: 2 a 2 0.04255319
#5: 2 b 7 0.14893617
#6: 2 c 33 0.70212766