首页 > 解决方案 > lapply、dplyr 和使用列表中的值

问题描述

我正在尝试从列表中的向量计算平均值,条件是该列表中另一个向量的值。这是一个简单的例子:

> df1 <- seq(1:10)
> df2 <- rep(0:1, 5) 
> 
> df3 <- bind_cols(df1, df2)
> df3
# A tibble: 10 x 2
    ...1  ...2
   <int> <int>
 1     1     0
 2     2     1
 3     3     0
 4     4     1
 5     5     0
 6     6     1
 7     7     0
 8     8     1
 9     9     0
10    10     1

基本上,如果第 2 列 == 0,我想计算第 1 列的平均值。非常简单,但是我想在几十个数据帧中执行此操作。为此,我正在使用该lapply函数,我首先创建一个包含所有数据框的列表(为简单起见,只有一个):

> z = list(df3)

df3 现在包含 df1 和 df2。我无法弄清楚的部分是lapply函数语法,如何根据 df2 值计算 df1 的平均值?我想象这样的事情:

tot_mean <- lapply(z[[1]], FUN = function(x) {
  mean(x[[df1]][[df2==1]])  
})

或更一般地说:

tot_mean <- lapply(z[[1]], FUN = function(x) {
  mean(df1 if df2 == 0)

此外,我的目标是从列表中删除 df2 ;当 df2 等于 0 时,剩下的唯一值就是 df1 的平均值。

我在这里的感觉是这个问题与我们如何通过这里的列表有关(即首先通过 df1,计算平均值,然后通过 df2,计算平均值)。我不一定需要使用列表,我很乐意将 df3 保留为数据框,但是我不确定如何设置 for 循环来运行不同的数据框并计算平均值。

谢谢!

标签: r

解决方案


如果 list_of_dfs 是一个数据框列表,并且对于列表中的每个数据框,当第二列为 0 时,您要计算第一列的平均值,它将是 lapply(list_of_dfs, function(x) mean(x[ [1]][x[[2]] == 0]))。如果要在 [[ 中使用列名,请将它们放在引号中。lapply(list_of_dfs, function(x) mean(x[["col_1"]][x[["col_2"]] == 0]))。(df 通常表示“数据框” - 我很奇怪您使用 df 作为名称的一部分来引用单个列、整个数据框和数据框列表。所以我将名称更改为试着让它更清楚。)——格雷戈尔·托马斯

(来自评论中的 Gergor,谢谢 Gregor!)


推荐阅读