繁体   English   中英

循环遍历 r 中的 groupby 列并应用 function

[英]Loop over groupby columns in r and apply a function

大家好,我需要帮助才能按列组循环遍历 dataframe。

这是 dataframe 的示例

  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 - 使用另一个函数打开一个treefile文件,其名称为anotherfunction df$Group name

5 - 获取 function 的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 值,例如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

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

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

我们应该得到类似的东西(这里的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 循环遍历 dataframe 但在这里我不知道如何处理由 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))

你可以尝试这样的事情:

library(dplyr)
library(purrr)

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

这会给你一个总结的 dataframe。 要获得相同数量的行,您可以left_joindf by Group

这是您的操作方法:

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()}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM