使用 R 根据数据框中的匹配值重新排列和对齐列

问题描述 投票:0回答:1

我有一个 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 中的不匹配列保留空单元格吗?非常感谢您的帮助!

r dplyr tidyverse tidyr mutate
1个回答
0
投票
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")
© www.soinside.com 2019 - 2024. All rights reserved.