我的数据框有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
}
}
}
没有错误,但是数据帧保持不变。我做错了什么,还有其他更好的方法吗?因为我将在非常大的数据集上执行此操作
答案 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