【问题标题】:How to call list elements for calculation of a new data.frame column如何调用列表元素来计算新的 data.frame 列
【发布时间】:2020-09-01 10:45:43
【问题描述】:

给定一个分组的 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 %&gt;% 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 元素以将它们包含在计算中的优雅方法是什么?

【问题讨论】:

  • 你的目标是什么?您是否试图让百分比列表示整个 n 列的百分比或组内的百分比。无论哪种方式,您的预期输出加起来都不会达到 100%。
  • 没错,这些只是一些随机数据,指的是真实df的一小部分。对我来说重要的部分是获得一个功能性解决方案来进行百分比计算。

标签: r functional-programming


【解决方案1】:

也许是这样

df %>% mutate(p = n/map_dbl(group, ~mylist[[.]]) * 100)

基本上,映射组来拉出mylist的选中元素。

您也可以考虑使用联接。

【讨论】:

  • 谢谢,这正是我想要的。
【解决方案2】:

我知道它不使用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   

【讨论】:

  • 这也是一种简洁明了的方式!
【解决方案3】:

您可以先将列表数据表示为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多