r - 使用条件均值和 NA 生成新变量

标签 r dplyr

我已经为一个感觉应该非常简单的操作而苦苦挣扎了一段时间,并尝试了不同的方法,但没有一个似乎有成效。

我有一个如下所示的数据集:

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,我需要 station1station3 的平均值。
  • 对于paul,我只需要4号站
  • 对于 ringo,我需要 station1、station2 的平均值, 站3;和
  • 对于乔治,我只需要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 中做类似的事情。

谢谢!

最佳答案

我会将数据转换为长格式,然后使用 case_when。如果您愿意,完成后可以将其转换回宽屏。

df$id = 1:nrow(df)

library(tidyr) 
df %>% pivot_longer(
    cols = starts_with("station"), 
    names_to = "station", names_prefix = "station",
    values_to = "value"
  ) %>%
  group_by(name, year) %>%
  mutate(result = case_when(
    name == "john" ~ mean(value[station %in% c(1, 3)], na.rm = TRUE),
    name %in% c("paul", "george") ~ value[station == 4],
    name == "ringo" ~ mean(value[station %in% c(1, 2, 3)], na.rm = TRUE)
  ))
# # A tibble: 48 x 6
# # Groups:   name, year [12]
#    name   year    id station value result
#    <fct> <dbl> <int> <chr>   <dbl>  <dbl>
#  1 john   2018     1 1           1   1   
#  2 john   2018     1 2          NA   1   
#  3 john   2018     1 3          NA   1   
#  4 john   2018     1 4           9   1   
#  5 paul   2018     2 1           2   8   
#  6 paul   2018     2 2           6   8   
#  7 paul   2018     2 3           2   8   
#  8 paul   2018     2 4           8   8   
#  9 ringo  2018     3 1           3   4.67
# 10 ringo  2018     3 2           8   4.67
# # ... with 38 more rows

关于r - 使用条件均值和 NA 生成新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58350155/

相关文章:

c++ - 我不明白 Rcpp 中的这种行为

r - 计算 `dplyr` 管道中的累积概率(Kaplan-Meier 生存函数)

r - 分面时的 ggplot geom_errorbar 宽度(并缩放 ="free")

r - R 中的信号量 (IPC)

r - 使用 pmap 遍历 tibble 的行

r - 在R : focused searching within R and all (3, 500+)CRAN软件包中找到所需的东西

r - 按列模式和绑定(bind)行拆分 data.frame R

r - 组不互斥时类似于 group_by 的功能

r - 根据 r 中先前行的条件创建新行

在 R 中重新排序单列,而不指定所有列