【问题标题】:Loop over groupby columns in r and apply a function循环遍历 r 中的 groupby 列并应用一个函数
【发布时间】:2021-03-16 19:30:27
【问题描述】:

大家好,我需要帮助才能按列组遍历数据框。

这是一个数据框的例子

  Group       Species Values
1    G1 Cattus_cattus   Val1
2    G1 Cattus_cattus   Val2
3    G1 Cattus_cattus   Val3
4    G2   Canis_lupus   Val4
5    G2   Canis_lupus   Val5
6    G3  Griseus_lupa   Val6
7    G4  Griseus_lupa   Val7

我想:

1 - 循环 c(df$Group,df$Species)

2 - 获取df$Values 并将其存储为vector

3 - 将该向量放入名为afunction的函数中

4 - 使用anotherfunction 打开一个treefile,其名称为df$Group name

5 - 获取该函数的 output value 并将其添加到 new_column

所以这里是代码应该做什么的一个例子:

第一组是G1,Cattus_cattus

  Group       Species Values
1    G1 Cattus_cattus   Val1
2    G1 Cattus_cattus   Val2
3    G1 Cattus_cattus   Val3

然后我用treefile <- anotherfunction(G1)打开treefile

然后我生成output_value<-afunction(treefile,c("Val1","Val2","Val3))等输出值

然后output_value = 30

所以我将 30 添加到 df 中:

  Group       Species Values new_column
1    G1 Cattus_cattus   Val1 30
2    G1 Cattus_cattus   Val2 30
3    G1 Cattus_cattus   Val3 30

如果 Group 中只有一行,那么我什么都不做并添加一个 NA。

请注意,它当然是一个不存在的函数,因此您无法重现该示例。

我们应该得到类似的东西(new_column 的值在这里是随机的)。

  Group       Species Values new_column
1    G1 Cattus_cattus   Val1 30
2    G1 Cattus_cattus   Val2 30
3    G1 Cattus_cattus   Val3 30
4    G2   Canis_lupus   Val4 21
5    G2   Canis_lupus   Val5 21
6    G3  Griseus_lupa   Val6 NA
7    G4  Griseus_lupa   Val7 NA

请问有人有想法吗? 到目前为止,我知道如何使用 for 循环遍历数据帧,但在这里我不知道如何处理由 2 列组成的组..

数据

structure(list(Group = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 4L
), .Label = c("G1", "G2", "G3", "G4"), class = "factor"), Species = structure(c(2L, 
2L, 2L, 1L, 1L, 3L, 3L), .Label = c("Canis_lupus", "Cattus_cattus", 
"Griseus_lupa"), class = "factor"), Values = structure(1:7, .Label = c("Val1", 
"Val2", "Val3", "Val4", "Val5", "Val6", "Val7"), class = "factor")), class = "data.frame", row.names = c(NA, 
-7L))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以试试这样的:

    library(dplyr)
    library(purrr)
    
    df %>%
      group_by(Group) %>%
      summarise(treefile = anotherfunction(first(Group)), 
                Values = list(Values)) %>%
      mutate(new_column = map2_dbl(treefile, Values, afunction)) 
    

    这将为您提供一个汇总的数据框。要获得相同数量的行数,您可以 left_joindf Group

    【讨论】:

      【解决方案2】:

      这是你的做法:

      anotherfunction = function(x){
        #do something with your treefile
        ifelse("Val2" %in% x, 30, ifelse("Val4" %in% x, 21, NA))
      }
      
      df %>% 
        group_by(Group) %>% 
        mutate(new_column=anotherfunction(Values))
      

      你没有提供很多关于 anotherfunction() 的信息,所以我使用了一个丑陋的嵌套 ifelse() 来模仿这种行为。

      关键是mutate() 将使用组内的值。

      要探索这一点,您可以尝试运行代码:

      anotherfunction = function(x){browser()}
      

      【讨论】:

        猜你喜欢
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 2010-12-09
        • 2018-05-13
        • 1970-01-01
        相关资源
        最近更新 更多