根据因子

时间:2016-09-16 20:14:20

标签: r dataframe dplyr

我很难描述这个,所以最好用一个例子来解释(可能从糟糕的问题标题中可以看出)。

使用dplyr我有一个group_bysummarize的结果我有一个数据框,我想通过因子做一些进一步的操作。

作为一个例子,这里的数据框看起来像我的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执行此操作,但我现在似乎无法解决这个问题。这将如何实现?

4 个答案:

答案 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