【发布时间】:2020-06-30 17:47:08
【问题描述】:
我有以下数据
df <- data.frame("group1" = c("A","B","B","C","D","D","C","E","E","A","B","B","C","D","D","C","E","E"),
"group2" = c("X","Y","Z","Z","W","F","Z","N","M","D","F","U","T","R","R","S","S","O"),
"val" = c(232,200,3321,400,600,500,22,33,1200,555,200,888,43,600,500,800,900,3213))
我想添加两个新列:
- 第 1 列将显示每个 group1 值具有最高“val”的 group2 值
- 第 2 列会做同样的事情,但会显示最大值占总数的百分比
所以,首先对数据进行分组:
df %>% group_by(group1,group2) %>% summarise("totalval" = sum(val)) %>% arrange(group1, desc(totalval))
# A tibble: 16 x 3
# Groups: group1 [5]
group1 group2 totalval
<fct> <fct> <dbl>
1 A D 555
2 A X 232
3 B Z 3321
4 B U 888
5 B F 200
6 B Y 200
7 C S 800
8 C Z 422
9 C T 43
10 D R 1100
11 D W 600
12 D F 500
13 E O 3213
14 E M 1200
15 E S 900
16 E N 33
所以我希望第 1 列具有值“D”,因为 group2 列中的值“D”在所有第 1 组中具有最高值。第 2 列将显示值 555 / (555 + 232) = 0.70对于 group1 列中值为“A”的所有行。
我找到了一种方法来获取第 1 列,方法是创建一个具有最高值的临时表,然后将其连接回主表,但我认为它相当复杂 - 我相信有一种更简洁的方法。我也不确定如何获得要添加的百分比(如上所述的第 2 列)。
到目前为止我的解决方案:
#add in overall val to use for percentages
df <- df %>% group_by(group1) %>% mutate("g1_total_val" = sum(val)) %>% ungroup()
#create temp table with selected values
t2 <- df %>% group_by(group1,group2) %>% summarise("totalval" = sum(val)) %>% arrange(group1, desc(totalval)) %>%
slice(1:1) %>% mutate("highest_g2" = group2) %>% select(group1, highest_g2)
df <- df %>% left_join(t2,on = "group1")
任何有关如何获取第 2 列以及添加到第 1 列的更简单方法的帮助都会很棒。
【问题讨论】:
标签: r