R 分配第二列,并将其分离到第一列

R 分配第二列,并将其分离到第一列,r,dataframe,R,Dataframe,我的数据结构如下: X1 X2 X3 AA x1;y1 100 BB 200 CC x3;y3;z3 300 DD x4;y4 400 可再现数据 df <- data.frame( X1 = c("AA", "BB", "CC", "DD"), X2 = c("x1;y1&qu

我的数据结构如下:

X1     X2          X3
AA     x1;y1       100
BB                 200
CC     x3;y3;z3    300
DD     x4;y4       400
可再现数据

df <- data.frame(
  X1 = c("AA", "BB", "CC", "DD"), 
  X2 = c("x1;y1", "", "x3,y3,z3", "x4;y4"),
  X3 = c("100", "200", "300", "400")
)

谢谢。

粘贴前两列,然后分成行:

library(tidyr)
library(dplyr)

df %>% 
  transmute(new = paste(X1, X2, sep = ";"), X3) %>% 
  separate_rows(new, sep = "[;,]") 


# # A tibble: 12 x 2
#    new   X3   
#    <chr> <fct>
#  1 AA    100  
#  2 x1    100  
#  3 y1    100  
#  4 BB    200  
#  5 x2    200  
#  6 CC    300  
#  7 x3    300  
#  8 y3    300  
#  9 z3    300  
# 10 DD    400  
# 11 x4    400  
# 12 y4    400 

粘贴前两列,然后分成行:

library(tidyr)
library(dplyr)

df %>% 
  transmute(new = paste(X1, X2, sep = ";"), X3) %>% 
  separate_rows(new, sep = "[;,]") 


# # A tibble: 12 x 2
#    new   X3   
#    <chr> <fct>
#  1 AA    100  
#  2 x1    100  
#  3 y1    100  
#  4 BB    200  
#  5 x2    200  
#  6 CC    300  
#  7 x3    300  
#  8 y3    300  
#  9 z3    300  
# 10 DD    400  
# 11 x4    400  
# 12 y4    400 

使用sep=;,粘贴两列;,然后看看这篇文章:用sep=;,粘贴两列;,然后看看这篇文章:当X2列为空时如何防止NA?当X2列为空时如何防止NA?
df %>% 
  transmute(new = paste(X1, X2, sep = ";"), X3) %>% 
  separate_rows(new, sep = "[;,]") %>% 
  filter(new != "")

# # A tibble: 11 x 2
#    new   X3   
#    <chr> <fct>
#  1 AA    100  
#  2 x1    100  
#  3 y1    100  
#  4 BB    200  
#  5 CC    300  
#  6 x3    300  
#  7 y3    300  
#  8 z3    300  
#  9 DD    400  
# 10 x4    400  
# 11 y4    400