给定一个分组的data.frame
和一个包含涉及每个组的另一个特征的总数的list
(组1为70,组2为90 ):
group <- c(1,1,1,1,2,2,2,2,2)
n<- c(2,4,10,2,4,5,2,8,9)
df <- data.frame(group, n) %>%
group_by(group)
mylist <- list(70, 90)
如何向data.frame
中添加一个新列,以反映mylist
中每个n
在n/mylist[[i]]*100
给出的相应组中所占的比例
我想过使用map_dbl
来遍历列表元素,但是,我想不通如何在mutate
(类似于df %>% mutate ("Percent" = n / map_dbl (mylist, .)*100)
)中调用这些命令来进行百分比计算,最终使其看起来像这样:
df$percent %>% c (2.9, 5.7, 14.3, 2.9, 4.4, 5.6, 2.2., 8.9, 10.0)
df
调用list
元素以将其包含在计算中的优雅方式是什么?
发布于 2020-05-15 15:01:29
也许这就是
df %>% mutate(p = n/map_dbl(group, ~mylist[[.]]) * 100)
基本上,映射group来拉出mylist的选定元素。
您还可以考虑使用联接。
发布于 2020-05-15 14:57:26
我知道它不使用purrr
,但是就用rowwise()
怎么样
library(dplyr)
df %>%
rowwise %>%
mutate(percent = n / mylist[[group]] * 100)
## A tibble: 9 x 3
# group n percent
# <dbl> <dbl> <dbl>
#1 1 2 2.86
#2 1 4 5.71
#3 1 10 14.3
#4 1 2 2.86
#5 2 4 4.44
#6 2 5 5.56
#7 2 2 2.22
#8 2 8 8.89
#9 2 9 10
发布于 2020-05-15 15:02:04
您可以首先将列表数据表示为data.frame,以使其更易于使用。
library(dplyr)
library(data.table)
group <- c(1,1,1,1,2,2,2,2,2)
n<- c(2,4,10,2,4,5,2,8,9)
df <- data.frame(group, n) %>%
group_by(group)
setDT(df)
mylist <- data.table(
group = c(1 ,2),
other.metric = c(70, 90)
)
dt <- merge(df, mylist, by = "group")
dt[, n_share := n / other.metric * 100]
dt
https://stackoverflow.com/questions/61822105
复制