需要合作伙伴提供特定级别的股份

时间:2019-06-21 13:03:20

标签: r

我的数据框有3列,第一列包含不同伙伴的名称,第二列包含不同级别(所有伙伴具有所有级别)。第三列包含该伙伴的特定级别的容量。看起来像这样

Partner | Level | Volume  
a       | 32    | 213  
b       | 32    | 450  
c       | 24    | 56
a       | 24    | 213

我想添加一列,以显示合作伙伴中特定级别的份额。例如,以上示例中的附加列将读取具有伙伴a的两行的50%值,剩下的读取100%的值。我尝试了这样的for循环

for (i in 1:nrow(df) {
  for (a in partners) {
    if (df$Partner[i] == a) {
      df$Share[i] <- df$Volume[i] / filter(aggregate(.~Partner, df, sum), Partner %in% i)$Volume
      break
    }
  }
}

没有错误,但是数据帧保持不变。我做错了什么,还有其他更好的方法吗?因为我将在非常大的数据集上执行此操作

2 个答案:

答案 0 :(得分:0)

这是基于R的解决方案:

df <- data.frame(Partner = c("a", "b", "c", "a"), Level = c(32, 32, 24, 23), Volume = c(213, 450, 56, 213))

df$Share <- sapply(1:nrow(df), function(k) df$Volume[k] / sum(df$Volume[df$Partner[k] == df$Partner]))*100
df

  Partner Level Volume Share
1       a    32    213    50
2       b    32    450   100
3       c    24     56   100
4       a    23    213    50

答案 1 :(得分:0)

一个相当简单的基础R解决方案是计算Partner的频率表,将每个频率除以1,然后将其与原始数据帧合并

Share <- as.data.frame(1/table(df$Partner))
names(Share) <- c("Partner", "Share")
df <- merge(df, Share, by = "Partner")

#### OUTPUT ####

  Partner Level Volume Share
1       a    32    213   0.5
2       a    24    213   0.5
3       b    32    450   1.0
4       c    24     56   1.0

另一个更清洁的解决方案可能是使用dplyr

library(dplyr)

df %>% 
    group_by(Partner) %>% 
    mutate(Share = 1/n())

#### OUTPUT ####

# A tibble: 4 x 4
# Groups:   Partner [3]
  Partner Level Volume Share
  <chr>   <int>  <int> <dbl>
1 a          32    213   0.5
2 b          32    450   1  
3 c          24     56   1  
4 a          24    213   0.5