基于R中长数据集的几个条件从某些列中删除数据

8cdiaqws  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个很长的数据集,其中每个参与者(id)有21行数据,以反映21个不同的时间点(time)。时间1、2和3表示在“天”1收集的数据,并且时间4、5、6表示从“天”2收集的数据,以此类推。我试图使它,如果“dep”或“anx”在“时间”2,5,8,11,14,17,20期间是NA,那么与“时间”相关联的“天”上的所有数据都是NA。
这是一个以更简化的方式(2个参与者,每个参与者6行数据)构造数据的示例

data <- structure(list(id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2), time = c(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6), day = c(1, 1, 1, 2, 2, 2, 1, 
1, 1, 2, 2, 2), dep = c(18, NA, 14, 13, 15, 14, 8, 8, 9, 7, NA, 
8), anx = c(28, NA, 22, 23, 25, 26, 7, 6, 7, 7, NA, 5)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -12L))

这就是我想要的样子:

在我的实际数据集中,我有超过3000行的数据,所以我试图找出是否有一个好方法来做到这一点。非常感谢你的洞察力。

lhcgjxsq

lhcgjxsq1#

library(dplyr)
data |>
  mutate(
    has_na_in_pos_2 = is.na(dep[2]) | is.na(anx[2]),
    across(c(dep, anx), \(col) ifelse(has_na_in_pos_2, NA, col)),
    .by = c(id, day)
  ) |>
  select(-has_na_in_pos_2)
# # A tibble: 12 × 5
#       id  time   day   dep   anx
#    <dbl> <dbl> <dbl> <dbl> <dbl>
#  1     1     1     1    NA    NA
#  2     1     2     1    NA    NA
#  3     1     3     1    NA    NA
#  4     1     4     2    13    23
#  5     1     5     2    15    25
#  6     1     6     2    14    26
#  7     2     1     1     8     7
#  8     2     2     1     8     6
#  9     2     3     1     9     7
# 10     2     4     2    NA    NA
# 11     2     5     2    NA    NA
# 12     2     6     2    NA    NA

相关问题