繁体   English   中英

如何将 function 应用于列表中 dataframe 中的每个元素,并在 Z6A8064B5DF4794555500553C47C55057DZ 中返回 dataframe

[英]How to apply a function to every element in a dataframe in a list and return a dataframe in R?

我有一个 dataframe 看起来像这个例子(只是更大):

Name <- c('Peter','Peter','Peter', 'Ben','Ben','Ben','Mary', 'Mary', 'Mary')
var1 <- c(0.4, 0.6, 0.7, 0.3, 0.9, 0.2, 0.4, 0.6, 0.7)
var2 <- c(0.5, 0.4, 0.2, 0.5, 0.4, 0.2, 0.1, 0.4, 0.2)
var3 <- c(0.2, 0.6, 0.9, 0.5, 0.5, 0.2, 0.5, 0.5, 0.2)
df <- data.frame(Name, var1, var2, var3)
df

我拆分了我的 dataframe 以便将 function 应用于每个组。

list_split= split(df[,2:4],df$Name)

my_list=vector("list",3)
for (i in seq_along(list_split)){
  my_list[[i]]=list(
    lapply(list_split[[i]],function(x) summary(x)))
} 

之后我写了一个 function 以便如果 'my_list' 中的值的平均值大于 0.9,则取 'split_list' 中的值的差值,否则只取值。 (请忽略该操作没有任何意义,我原来的function很不一样。):

l <- list()
    fun <- function(x,y) {ifelse(mean(x) > 0.9,diff(y),y)}
    for (j in seq_along(list_split)){
      for (i in seq_along(my_list)){
        u <- mapply(fun,my_list[[i]][[1]],list_split[[j]], SIMPLIFY = FALSE)
        l[[j]] <- u
      }
    }

我希望将 function 应用于“list_split”中数据帧中“var”的所有值。 例如对于list_split[["Ben"]]的值是:

var1 var2 var3
4  0.3  0.5  0.5
5  0.9  0.4  0.5
6  0.2  0.2  0.2

但它只是应用于每个 'var' 的第一个值,因此第一个元素的结果列表如下所示:

l[[1]]
$var1
[1] 0.3

$var2
[1] 0.5

$var3
[1] 0.5

那么如何将 function 应用于每个“list_split”元素中的所有值,并最终得到一个完全保留“list_split”结构的列表,即数据帧列表?

谢谢!

我们可以试试

Map(\(x, y) {
   x[] <- Map(\(u, v) if(mean(v) > 0.9) c(NA, diff(u)) else u, x, y)
   x
    }, list_split, lapply(my_list, \(x) do.call("c", x)))

-输出

$Ben
  var1 var2 var3
4  0.3  0.5  0.5
5  0.9  0.4  0.5
6  0.2  0.2  0.2

$Mary
  var1 var2 var3
7  0.4  0.1  0.5
8  0.6  0.4  0.5
9  0.7  0.2  0.2

$Peter
  var1 var2 var3
1  0.4  0.5  0.2
2  0.6  0.4  0.6
3  0.7  0.2  0.9

这是一种方法:

l <- as.list(names(list_split))

fun <- function(x,y) {ifelse(x > 0.9, y-x, y)}
for (j in seq_along(list_split)){
  df2 <- df2[0,]
  df2 <- data.frame(matrix(ncol = 3, nrow = 3))
  names(df2) <- c("var1", "var2", "var3")
  for (i in seq_along(list_split[[j]])){
    for (h in seq_along(list_split[[j]][[i]])){
      u <- mapply(fun,my_list[[j]][[1]][[i]][[4]],list_split[[j]][[i]][[h]], SIMPLIFY = FALSE)
      df2[[i]][[h]] <- u
    }
  }
  l[[j]] <- df2
}

names(l) <- names(list_split)
l

这给出了:

$Ben
  var1 var2 var3
4  0.3  0.5  0.5
5  0.9  0.4  0.5
6  0.2  0.2  0.2

$Mary
  var1 var2 var3
7  0.4  0.1  0.5
8  0.6  0.4  0.5
9  0.7  0.2  0.2

$Peter
  var1 var2 var3
1  0.4  0.5  0.2
2  0.6  0.4  0.6
3  0.7  0.2  0.9

暂无
暂无

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

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