我有一个 R 数据框,我想根据每列中的匹配值重新排列列。然而,在许多情况下,空行中的列不匹配。这是初始数据框的示例:
这是所需的输出:
ID Col1 Col2 Col3
A X X
B Y Q Q
B Y
C Z Z
D P P Q
E R
F R S
这是预期的输出
ID Col1 Col2 Col3
A X X
B Y Y
B Q Q
C Z Z
D P P
D Q
E R
F R
F S
我已经接受了这个使用循环,但我想使用 tider、dplyer、tidyverse、mutate、pivot_longer 和pivot_wider 来做同样的工作,我尝试过但不能。
有人可以提供指导或代码示例,说明如何根据行中的匹配值重新排序和对齐列,同时为 R 中的不匹配列保留空单元格吗?非常感谢您的帮助!
library(dplyr)
library(tidyr) # pivot_*
quux %>%
pivot_longer(cols = -ID) %>%
filter(nzchar(value)) %>%
mutate(val2 = value) %>%
pivot_wider(id_cols = c(ID, value), names_from = name, values_from = val2, values_fill = "") %>%
select(-value)
# # A tibble: 9 × 4
# ID Col1 Col2 Col3
# <chr> <chr> <chr> <chr>
# 1 A "X" "X" ""
# 2 B "Y" "" "Y"
# 3 B "" "Q" "Q"
# 4 C "Z" "" "Z"
# 5 D "P" "P" ""
# 6 D "" "" "Q"
# 7 E "R" "" ""
# 8 F "R" "" ""
# 9 F "" "S" ""
数据
quux <- structure(list(ID = c("A", "B", "B", "C", "D", "E", "F"), Col1 = c("X", "Y", "", "Z", "P", "R", "R"), Col2 = c("X", "Q", "", "", "P", "", "S"), Col3 = c("", "Q", "Y", "Z", "Q", "", "")), row.names = c(NA, -7L), class = "data.frame")