像数据帧一样合并 df 中的列 - 获取 df 中各列具有相同值的行

Ada*_*amm 3 r dataframe

我花了一些时间寻找解决方案,但是我失败了......就像标题中一样,实际上我不知道如何解释,所以示例 df:

A <- c('ABC','GHI',rep(NA,3))
B <- c('AAB','ABC','BCE','CAB',NA)
C <- c('ABC','BCE','GHI','XXX','ZZZ')
D <- c('BCE',rep(NA,4))
E <- c('GHI','ZZZ','BAR',rep(NA,2))
df <- data.frame(A,B,C,D,E)

     A    B   C    D    E
1  ABC  AAB ABC  BCE  GHI
2  GHI  ABC BCE <NA>  ZZZ
3 <NA>  BCE GHI <NA>  BAR
4 <NA>  CAB XXX <NA> <NA>
5 <NA> <NA> ZZZ <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

现在我想对行重新排序,使每行具有相同的值,或者NA如果某些列中不存在特定值。期望的输出:

    A   B   C   D   E
1   ABC ABC ABC NA  NA
2   GHI NA  GHI NA  GHI
3   NA  AAB NA  NA  NA
4   NA  BCE BCE BCE NA
5   NA  NA  ZZZ NA  ZZZ
6   NA  NA  XXX NA  NA
7   NA  NA  NA  NA  BAR
8   NA  CAB NA  NA  NA
Run Code Online (Sandbox Code Playgroud)

顺序并不重要,您能给我一个提示如何实现这一点吗?

Dar*_*sai 5

您可以将数据旋转为长,然后再旋转回宽。

\n
library(tidyverse)\n\ndf %>%\n  pivot_longer(everything(), values_drop_na = TRUE) %>%\n  mutate(id = value) %>% \n  pivot_wider(id_cols = id)\n\n# # A tibble: 8 \xc3\x97 6\n#   id    A     B     C     D     E    \n#   <chr> <chr> <chr> <chr> <chr> <chr>\n# 1 ABC   ABC   ABC   ABC   NA    NA   \n# 2 AAB   NA    AAB   NA    NA    NA   \n# 3 BCE   NA    BCE   BCE   BCE   NA   \n# 4 GHI   GHI   NA    GHI   NA    GHI  \n# 5 ZZZ   NA    NA    ZZZ   NA    ZZZ  \n# 6 BAR   NA    NA    NA    NA    BAR  \n# 7 CAB   NA    CAB   NA    NA    NA   \n# 8 XXX   NA    NA    XXX   NA    NA\n
Run Code Online (Sandbox Code Playgroud)\n

等效base方式:

\n
reshape(transform(na.omit(stack(df)), id = values),\n        direction = "wide", idvar = "id", timevar = "ind", v.names = "values")\n
Run Code Online (Sandbox Code Playgroud)\n