【问题标题】:How to copy value of a cell to other rows based on the same Subject ID?如何根据相同的主题 ID 将单元格的值复制到其他行?
【发布时间】:2021-09-07 14:24:24
【问题描述】:

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

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

我看到了一个类似的线程How to copy value of a cell to other rows based on the value of other two columns?,但是每组只有一个缺失的 NA 值(每组的 NA 并不多)。使用zoo 包中的以下解决方案,我只需将每个 NA 替换为之前的最新非 NA。

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

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

感谢您的所有回答!

【问题讨论】:

  • 尝试用fill代替mutate,比如fill(Skill)

标签: r matching zoo


【解决方案1】:

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

【讨论】:

  • 感谢您抽出宝贵时间,Vinicius!现在可以了!
【解决方案2】:

在日期和主题上取最大值或最小值怎么样?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2021-01-13
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2014-07-03
    相关资源
    最近更新 更多