[英]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_join
与df
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.