将包含dplyr函数中的group_by的函数应用于R中的datalist

问题描述 投票:1回答:1

我有一个像这样的data.list:

list(structure(list(group = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L
), species = structure(c(3L, 3L, 1L, 3L, 3L, 2L, 3L, 1L, 3L, 
1L, 3L, 1L, 3L, 1L, 2L, 4L, 1L, 4L, 2L, 3L, 3L, 3L, 2L, 2L), .Label = 
c("Apiaceae", 
"Ceyperaceae", "Magnoliaceae", "Vitaceae"), class = "factor"), 
N = c(2L, 2L, 3L, 2L, 2L, 1L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 
3L, 1L, 4L, 3L, 4L, 1L, 2L, 2L, 2L, 1L, 1L)), class = "data.frame", 
row.names = c(NA, 
-24L)), structure(list(group = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L), species = structure(c(3L, 3L, 1L, 3L, 3L, 2L, 3L, 1L, 3L, 
1L, 3L, 1L, 3L, 1L, 2L, 4L, 1L, 4L, 2L, 3L, 3L, 3L, 2L, 2L), .Label = 
c("Apiaceae", 
"Ceyperaceae", "Magnoliaceae", "Vitaceae"), class = "factor"), 
N = c(2L, 2L, 3L, 2L, 2L, 1L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 
3L, 1L, 4L, 3L, 4L, 1L, 2L, 2L, 2L, 1L, 1L)), class = "data.frame", 
row.names = c(NA, 
-24L)))

我想将在dplyr包中编写的my.fun应用于此数据列表。首先,我按“组”对数据进行分组,得到已经存在于R中的函数的输出,然后将此函数应用于数据列表。但输出为0.没有任何输出。你能帮我找出错误吗?

 my.fun <- function(x, y){
    group_by(x, !!as.name(group)) %>%
    mutate(out = diversity(N, "shannon")) 
 }

check <- lapply(colnames(list), function(x) {
  my.fun(x$group, x$N)
}) 

非常感谢!

r function dplyr lapply datalist
1个回答
2
投票

假设我们正在传递组列和将diversity应用为字符串的列,

library(tidyverse)
library(vegan)
my.fun <- function(data, grpCol, divCol) {
       data %>% 
           group_by_at(grpCol) %>%
           mutate(out = diversity(!! rlang::sym(divCol), "shannon"))
           #or use mutate_at
           # mutate_at(vars(divCol), list(out = ~ diversity(., "shannon")))
    }

map(lst1, my.fun, grpCol = "group", divCol = "N")
#[[1]]
# A tibble: 24 x 4
# Groups:   group [3]
#   group species          N   out
#   <int> <fct>        <int> <dbl>
# 1     1 Magnoliaceae     2  1.75
# 2     1 Magnoliaceae     2  1.75
# 3     1 Apiaceae         3  1.75
# 4     1 Magnoliaceae     2  1.75
# 5     1 Magnoliaceae     2  1.75
# 6     1 Ceyperaceae      1  1.75
# 7     2 Magnoliaceae     2  2.06
# 8     2 Apiaceae         3  2.06
# 9     2 Magnoliaceae     2  2.06
#10     2 Apiaceae         3  2.06
# … with 14 more rows

#[[2]]
# A tibble: 24 x 4
# Groups:   group [3]
#   group species          N   out
#   <int> <fct>        <int> <dbl>
# 1     1 Magnoliaceae     2  1.75
# 2     1 Magnoliaceae     2  1.75
# 3     1 Apiaceae         3  1.75
# 4     1 Magnoliaceae     2  1.75
# 5     1 Magnoliaceae     2  1.75
# 6     1 Ceyperaceae      1  1.75
# 7     2 Magnoliaceae     2  2.06
# 8     2 Apiaceae         3  2.06
# 9     2 Magnoliaceae     2  2.06
#10     2 Apiaceae         3  2.06
# … with 14 more rows

注意

identical(lst1[[1]], lst1[[2]])
#[1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.