【问题标题】:lapply, dplyr, and using values within listslapply、dplyr 和使用列表中的值
【发布时间】:2021-02-05 05:41:05
【问题描述】:

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

> 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 循环以遍历不同的数据框并计算平均值。

谢谢!

【问题讨论】:

  • 这里不需要lapply - 你没有迭代任何东西。 mean(df1[df2 == 0]).
  • 如果list_of_dfs是一个数据框列表,并且,对于列表中的每个数据框,当第二列为0时,您要计算第一列的平均值,则为@987654330 @。如果您想在[[ 中使用列名,请将它们放在引号中。 lapply(list_of_dfs, function(x) mean(x[["col_1"]][x[["col_2"]] == 0]))。 (df 通常表示“数据框” - 我很奇怪您使用 df 作为名称的一部分来指代单个列、整个数据框和数据框列表。所以我已经更改名称以使其更清晰。)

标签: r


【解决方案1】:

如果 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 作为名称的一部分来引用单个列、整个数据框和数据框列表。所以我将名称更改为尽量让它更清楚。)——格雷戈尔·托马斯

(来自 cmets 的 Gergor,感谢 Gregor!)

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多