0

我有以下数据集。

PERSONID CODE1 CODE2 CODE3 CODE4
AX1      02    NA    NA    NA
AX1      NA    03    NA    NA
AX1      NA    NA    54.3  NA
AX1      NA    NA    NA    21
AX2      NA    01    NA    NA
AX2      01    NA    NA    NA

对于每个人 ID,CODE 的四个可能值分布在 var CODE1-4 中。我怎样才能堆叠它,以便不管位置,代码都在同一行?

PERSONID CODE1 CODE2 CODE3 CODE4
AX1      02    03    54.3    21
AX2      01    01    NA    NA

谢谢你。

4

2 回答 2

0

使用基础 R:

df<- data.frame('PERSONID'=c(rep('AX1',4),rep('AX2',2)),
            'CODE1'=c('02',rep(NA,4),'01'),
            'CODE2'=c(NA,'03',NA,NA,'01',NA),
            'CODE3'=c(NA,NA,54.3,NA,NA,NA),
            'CODE4'=c(NA,NA,NA,21,NA,NA))

newDF <- Reduce(
  function(x, y, ...) merge(x, y, all = TRUE, ...),
  list(aggregate(CODE1~PERSONID,na.action = na.omit,df, unique),
       aggregate(CODE2~PERSONID,na.action = na.omit,df, unique),
       aggregate(CODE3~PERSONID,na.action = na.omit,df, unique),
       aggregate(CODE4~PERSONID,na.action = na.omit,df, unique))
)

结果是:

newDF
  PERSONID CODE1 CODE2 CODE3 CODE4
1      AX1    02    03  54.3    21
2      AX2    01    01    NA    NA
于 2021-01-05T20:36:03.210 回答
0

有了dplyr你就可以group_byPERSONID,然后summarize。这将为每列使用第一个非 NA 值。

library(dplyr)

df %>%
  group_by(PERSONID) %>%
  summarize(across(everything(), ~first(na.omit(.))))

输出

  PERSONID CODE1 CODE2 CODE3 CODE4
  <chr>    <int> <int> <dbl> <int>
1 AX1          2     3  54.3    21
2 AX2          1     1  NA      NA
于 2021-01-05T20:16:16.307 回答