dplyr 你可以这样试试:
df <- data.frame(index = 1:6,
id = c("abc", "abc", "abc", "def", "ghi", "ghi"),
value = c(10000,10000,10000,50000, 20000, 20000),
value2 = c(14,2,4,6,3,3))
df %>%
group_by(id) %>%
mutate(value = value*(value2/sum(value2)))
index id value value2
<int> <fct> <dbl> <dbl>
1 1 abc 7000 14
2 2 abc 1000 2
3 3 abc 2000 4
4 4 def 50000 6
5 5 ghi 10000 3
6 6 ghi 10000 3
编辑:这是你提到的扩展。
df <- data.frame(index = 1:6,
id = c("abc", "abc", "abc", "def", "ghi", "ghi"),
value = c(10000,10000,10000,50000, 20000, 20000),
value2 = c(14,NA,4,6,NA, NA))
df %>%
group_by(id) %>%
mutate(value2 = ifelse(!all(is.na(value2)) & is.na(value2), 0,
value2)) %>%
mutate(value = ifelse(is.na(value2),
value/length(value2),
value*(value2/sum(value2))))
index id value value2
<int> <fct> <dbl> <dbl>
1 1 abc 7778. 14
2 2 abc 0 0
3 3 abc 2222. 4
4 4 def 50000 6
5 5 ghi 10000 NA
6 6 ghi 10000 NA