【发布时间】:2019-10-12 01:41:11
【问题描述】:
我一直在为应该是一个非常简单的操作而苦苦挣扎,并尝试了不同的方法,但似乎都没有结果。
我有一个如下所示的数据集:
df <- data.frame(name = c("john", "paul", "ringo", "george", "john", "paul", "ringo", "george", "john", "paul", "ringo", "george"),
year = c(2018, 2018, 2018, 2018, 2017, 2017, 2017, 2017, 2016, 2016, 2016, 2016),
station1 = c(1, 2, 3, NA, 2, NA, 5, 6, 7, 8, 9, 0),
station2 = c(NA, 6, 8, 1, 2, 6, NA, 1, NA, 1, 5, 3),
station3 = c(NA, 2, 3, 5, 1, NA, 1, 5, 3, 1, 2, 3),
station4 = c(9, 8, 7, 6, NA, 8, 12, 8, 83, 4, 3, NA))
现在,我需要的是创建一个新变量,我们称之为 new_station,它在每个给定年份的每个名称上取一个值。例如:
- 对于 john,我需要 station1 和 station3 的平均值。
- 对于 paul,我只需要 station 4。
- 对于 ringo 我需要 station1、station2 的平均值, 站3;和
- 对于 george,我只需要 station4。
我尝试了几种过滤器、选择和变异的组合,大致如下:
df %>%
filter(name == "john") %>%
select(station1, station3) %>%
mutate(new_station = rowMeans(c(station1, station3)))
但它不会让我将值仅分配给单行的值。当我只需要该特定年份的平均值时,其他一些尝试导致新列中的每一行成为所有 6 个单元格(2 个站 x 3 年)的平均值。我尝试过的其他方法无法处理存在一些缺失值的事实,我需要省略这些值。
我需要一种可扩展的循环,只需更改每个名称的条件,因为在现实生活中我有一个包含 21 个名称和 30 个站点的数据集。
有什么想法吗?
注意:如果它说明了我想要做什么,我知道如何在 Stata 中执行此操作。在 Stata 中,对于名称 john,它看起来像:
egen new_station = rowmean(station1 station3) if name == "john"
我只需要在 R 中做类似的事情。
谢谢!
【问题讨论】: