【发布时间】:2019-12-23 19:49:26
【问题描述】:
我有一个数据框,我想为其创建行均值的列。应该为数据中的一组列计算每一行平均列。它们是相互关联的。我可以使用 dplyr 的starts_with() 区分列组。由于我有几组列来计算行均值,因此我想构建一个函数来完成它。由于某种原因,我无法让它工作。
数据
df <- data.frame("europe_paris" = 1:10,
"europe_london" = 11:20,
"europe_rome" = 21:30,
"asia_bangkok" = 31:40,
"asia_tokyo" = 41:50,
"asia_kathmandu" = 51:60)
set.seed(123)
df <- as.data.frame(lapply(df, function(cc) cc[ sample(c(TRUE, NA),
prob = c(0.70, 0.30),
size = length(cc),
replace = TRUE) ]))
df
europe_paris europe_london europe_rome asia_bangkok asia_tokyo asia_kathmandu
1 1 NA NA NA 41 51
2 NA 12 22 NA 42 52
3 3 13 23 33 43 NA
4 NA 14 NA NA 44 54
5 NA 15 25 35 45 55
6 6 NA NA 36 46 56
7 7 17 27 NA 47 57
8 NA 18 28 38 48 NA
9 9 19 29 39 49 NA
10 10 NA 30 40 NA 60
我想为每个大陆跨城市的行均值创建一个新列。亚洲城市一栏,欧洲一栏。该函数的每次运行都将输入一个大陆的名称,以指导选择哪些列。
我尝试构建函数
此尝试基于this answer。
continent_mean <-
function(continent) {
df %>%
select(starts_with(as.character(continent))) %>%
mutate(., (!!as.name(continent)) == rowMeans(., na.rm = TRUE))
}
但是,运行此代码会导致一种奇怪的行为,因为它似乎返回相同的数据集,只有根据 starts_with() 选择的列,但它不会为行均值生成新列。
continent_mean("asia")
asia_bangkok asia_tokyo asia_kathmandu
1 31 41 51
2 32 42 52
3 33 43 53
4 34 44 54
5 35 45 55
6 36 46 56
7 37 47 57
8 38 48 58
9 39 49 59
10 40 50 60
我在这里缺少什么?我认为这可能是由于mutate() 中的== 而不是=,但是单个= 会引发错误,因此它似乎也不是解决方案。
谢谢!
【问题讨论】: