r - 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 循环来运行不同的数据框并计算平均值。
谢谢!
解决方案
如果 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!)
推荐阅读
- json - 如何获取服务器从 reqwest http 调用发回的数据?
- wpf - 在另一个线程中使用 BitmapDecoder 然后在哪里创建。(调用线程无法访问该对象,因为不同的线程拥有它。)
- r - 获得循环产生的多个模型的平均边际效应
- python - Python:从时间戳中添加或删除时区小时并获取实际时间
- java - 如何将对象添加为对象java的子对象
- python - 为什么在启动时自动运行我的 python 脚本不起作用?
- r - 将 Value 替换为一组数字在该点之前出现在向量中的次数
- javascript - 无法在 Angular 项目中安装 npm 包
- android - Unity中的SetActive
- docker - 这是我在使用 amazon ec2 ubuntu 18.04 安装 docker 引擎时遇到的问题