如何根据相同的主题 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
我有以下问题。我有一个如下所示的数据框:
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
我看到了一个类似的线程 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