2016-09-16 42 views
1

我很难描述这个问题,所以最好用一个例子来解释(可以从很差的问题标题中看到)。基于一个因素在数据框上执行操作

使用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 

我想这取决于run的值来划分sum。举例来说,如果我有:

> 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

DF $%的< - DF $金额/总[DF $来看, '总'] – HubertL

+0

非常优雅的HubertL。如果您发布答案,我会接受。这比我用mutate设想的更简单(尽管这确实有效)。 –

回答

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 
0

首先要在总价值合并到您的DF:

df2 <- merge(df, total, by = "run") 

,那么你可以调用发生变异:

df2 %<>% mutate(percent = sum/total) 
1

如果你的 “运行” 的值是1,2,... N,则这将工作

divisor <- c(45,47) # c(45,47,...up to n divisors) 
df$percent <- df$sum/divisor[df$run] 
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 
相关问题