如何根据相同的主题 ID 将单元格的值复制到其他行?

How to copy value of a cell to other rows based on the same Subject ID?

我有以下问题。我有一个如下所示的数据框:

Date       Period  Subject    Skill
1.1.2020     1        1           1
1.1.2020     1        2           3
1.1.2020     1        3           1 
1.1.2020     1        4           3 
1.1.2020     2        1           NA
1.1.2020     2        2           NA
1.1.2020     2        3           NA 
1.1.2020     2        4           NA 
1.1.2020     3        1           NA
1.1.2020     3        2           NA
1.1.2020     3        3           NA 
1.1.2020     3        4           NA 
1.1.2021     1        1           4
1.1.2021     1        2           4
1.1.2021     1        3           1 
1.1.2021     1        4           3 
1.1.2021     2        1           NA
1.1.2021     2        2           NA
1.1.2021     2        3           NA
1.1.2021     2        4           NA 
1.1.2021     3        1           NA
1.1.2021     3        2           NA
1.1.2021     3        3           NA
1.1.2021     3        4           NA 

我想将在同一日期参加考试的每个科目(在本例中代表一个独特的组)的第 1 期的 Skill 值复制到第 2 期和第 3 期的同一科目. 所需的输出应如下所示:

Date       Period  Subject    Skill
1.1.2020     1        1           1
1.1.2020     1        2           3
1.1.2020     1        3           1 
1.1.2020     1        4           3 
1.1.2020     2        1           1
1.1.2020     2        2           3
1.1.2020     2        3           1
1.1.2020     2        4           3
1.1.2020     3        1           1
1.1.2020     3        2           3
1.1.2020     3        3           1
1.1.2020     3        4           3
1.1.2021     1        1           4
1.1.2021     1        2           4
1.1.2021     1        3           1 
1.1.2021     1        4           3 
1.1.2021     2        1           4
1.1.2021     2        2           4
1.1.2021     2        3           1
1.1.2021     2        4           3
1.1.2021     3        1           4
1.1.2021     3        2           4
1.1.2021     3        3           1
1.1.2021     3        4           3

我看到了一个类似的线程 但是每组只缺少一个 NA 值(每组 NA 不多)。使用 zoo 包中的以下解决方案,我只用之前的最新非 NA 替换每个 NA。

x %>% group_by(Date, Subject) %>% mutate(Skill= na.locf(Skill))

简而言之,我想根据组内相同的主题 ID 将单元格的值与其他行相匹配。

感谢您的所有回答!

只取日期和主题的最大值或最小值怎么样?

图书馆

library(tidyverse)

数据

df <-
  structure(list(Date = structure(c(18262, 18262, 18262, 18262, 
                                    18262, 18262, 18262, 18262, 18262, 18262, 18262, 18262, 18628, 
                                    18628, 18628, 18628, 18628, 18628, 18628, 18628, 18628, 18628, 
                                    18628, 18628), class = "Date"), Period = c(1L, 1L, 1L, 1L, 2L, 
                                                                               2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 
                                                                               3L, 3L, 3L), Subject = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 
                                                                                                        2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), 
                 Skill = c(1L, 3L, 1L, 3L, NA, NA, NA, NA, NA, NA, NA, NA, 
                           4L, 4L, 1L, 3L, NA, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
                                                                                                                 -24L))

代码

df %>% 
  group_by(Date,Subject) %>% 
  fill(Skill) 

输出

# A tibble: 24 x 4
# Groups:   Date, Subject [8]
   Date       Period Subject Skill
   <date>      <int>   <int> <int>
 1 2020-01-01      1       1     1
 2 2020-01-01      1       2     3
 3 2020-01-01      1       3     1
 4 2020-01-01      1       4     3
 5 2020-01-01      2       1     1
 6 2020-01-01      2       2     3
 7 2020-01-01      2       3     1
 8 2020-01-01      2       4     3
 9 2020-01-01      3       1     1
10 2020-01-01      3       2     3