【发布时间】: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