R 使用分隔符拆分多个列,并在分隔符中具有一致的列名

R 使用分隔符拆分多个列,并在分隔符中具有一致的列名,r,dplyr,split,R,Dplyr,Split,我有一个很大的数据集,下面是示例(原始数据有更多的列) dta0 = data.frame(cbind(paste(seq(10,15),seq(20,25),sep = ";"), paste(seq(30,35),seq(40,45),sep = ";") ) ) colnames(dta0) = c("H1","H2") 这是我想要的输出 desired_dta = data.frame(cbi

我有一个很大的数据集,下面是示例(原始数据有更多的列)

dta0 = data.frame(cbind(paste(seq(10,15),seq(20,25),sep = ";"),
paste(seq(30,35),seq(40,45),sep = ";")    )     )
colnames(dta0) = c("H1","H2")
这是我想要的输出

desired_dta = data.frame(cbind(seq(10,15),seq(20,25),seq(30,35),seq(40,45)))
colnames(desired_dta) = c("H1_x","H1_y","H2_x","H2_y")
如何命名列,如“H1\u x”、“H1\u y”、“H2\u x”、“H2\u y”…?

您可以尝试

library(tidyr)
dta0%>%
单独的(H1,c(“H1_x”,“H1_y”),“;”)%>%
分开(H2,c(“H2_x”,“H2_y”),“;”)
#>H1_x H1_y H2_x H2_y
#> 1   10   20   30   40
#> 2   11   21   31   41
#> 3   12   22   32   42
#> 4   13   23   33   43
#> 5   14   24   34   44
#> 6   15   25   35   45
或者在R底

setNames(如.data.frame(do.call)(cbind,lappy(dta0,
函数(x)do.call(rbind,strsplit(x,“;”))),
未列出(lappy(名称(dta0)、paste0、c(“'ux'、'uy”))
#>H1_x H1_y H2_x H2_y
#> 1   10   20   30   40
#> 2   11   21   31   41
#> 3   12   22   32   42
#> 4   13   23   33   43
#> 5   14   24   34   44
#> 6   15   25   35   45
您可以试试

library(tidyr)
dta0%>%
单独的(H1,c(“H1_x”,“H1_y”),“;”)%>%
分开(H2,c(“H2_x”,“H2_y”),“;”)
#>H1_x H1_y H2_x H2_y
#> 1   10   20   30   40
#> 2   11   21   31   41
#> 3   12   22   32   42
#> 4   13   23   33   43
#> 5   14   24   34   44
#> 6   15   25   35   45
或者在R底

setNames(如.data.frame(do.call)(cbind,lappy(dta0,
函数(x)do.call(rbind,strsplit(x,“;”))),
未列出(lappy(名称(dta0)、paste0、c(“'ux'、'uy”))
#>H1_x H1_y H2_x H2_y
#> 1   10   20   30   40
#> 2   11   21   31   41
#> 3   12   22   32   42
#> 4   13   23   33   43
#> 5   14   24   34   44
#> 6   15   25   35   45

另一个选项是使用
分隔行()
然后重塑为长行,然后重塑为宽行。代码如下:

library(tidyverse)
#Code
dta0 %>% mutate(id=1:n()) %>%
  separate_rows(c(H1,H2),sep = ';') %>%
  group_by(id) %>% mutate(Var=1:n()) %>%
  pivot_longer(-c(id,Var)) %>%
  mutate(Var=ifelse(Var==1,'x','y'),
         name=paste0(name,'.',Var)) %>% select(-c(Var)) %>%
  pivot_wider(names_from = name,values_from=value) %>% ungroup() %>%
  select(-id) %>%
  select(sort(current_vars())) %>% 
  mutate_each(funs = as.numeric)
输出:

# A tibble: 6 x 4
   H1.x  H1.y  H2.x  H2.y
  <dbl> <dbl> <dbl> <dbl>
1    10    20    30    40
2    11    21    31    41
3    12    22    32    42
4    13    23    33    43
5    14    24    34    44
6    15    25    35    45
#一个tible:6 x 4
H1.xh1.yh2.xh2.y
1    10    20    30    40
2    11    21    31    41
3    12    22    32    42
4    13    23    33    43
5    14    24    34    44
6    15    25    35    45

另一个选项是使用
分隔行()
然后重塑为长行,然后重塑为宽行。代码如下:

library(tidyverse)
#Code
dta0 %>% mutate(id=1:n()) %>%
  separate_rows(c(H1,H2),sep = ';') %>%
  group_by(id) %>% mutate(Var=1:n()) %>%
  pivot_longer(-c(id,Var)) %>%
  mutate(Var=ifelse(Var==1,'x','y'),
         name=paste0(name,'.',Var)) %>% select(-c(Var)) %>%
  pivot_wider(names_from = name,values_from=value) %>% ungroup() %>%
  select(-id) %>%
  select(sort(current_vars())) %>% 
  mutate_each(funs = as.numeric)
输出:

# A tibble: 6 x 4
   H1.x  H1.y  H2.x  H2.y
  <dbl> <dbl> <dbl> <dbl>
1    10    20    30    40
2    11    21    31    41
3    12    22    32    42
4    13    23    33    43
5    14    24    34    44
6    15    25    35    45
#一个tible:6 x 4
H1.xh1.yh2.xh2.y
1    10    20    30    40
2    11    21    31    41
3    12    22    32    42
4    13    23    33    43
5    14    24    34    44
6    15    25    35    45

假设数据的列数为偶数:

nc = ncol(desired_dta)
colnames(desired_dta) = paste0("H",rep(1:(nc/2),each = 2),rep(c("_x","_y"),nc/2))

假设数据的列数为偶数:

nc = ncol(desired_dta)
colnames(desired_dta) = paste0("H",rep(1:(nc/2),each = 2),rep(c("_x","_y"),nc/2))

这里有一个带有
cSplit

library(splitstackshape)
cSplit(dta0, names(dta0), sep=";")
#   H1_1 H1_2 H2_1 H2_2
#1:   10   20   30   40
#2:   11   21   31   41
#3:   12   22   32   42
#4:   13   23   33   43
#5:   14   24   34   44
#6:   15   25   35   45

这里有一个带有
cSplit

library(splitstackshape)
cSplit(dta0, names(dta0), sep=";")
#   H1_1 H1_2 H2_1 H2_2
#1:   10   20   30   40
#2:   11   21   31   41
#3:   12   22   32   42
#4:   13   23   33   43
#5:   14   24   34   44
#6:   15   25   35   45

谢谢你的评论。有没有办法不用手动选择和命名每一列?我的数据集太大了。@AllanCameron我喜欢第二种方法非常干净,没有包依赖性!谢谢你的评论。我应该有一个选择N列的代码吗?示例只有H1和H2,但我总共有24小时。@Johnlegend2这将拆分任意数量的H列而不指定它们(只要您只有H列)谢谢你的评论。有没有办法不用手动选择和命名每一列?我的数据集太大了。@AllanCameron我喜欢第二种方法非常干净,没有包依赖性!谢谢你的评论。我应该有一个选择N列的代码吗?示例只有H1和H2,但我总共有24小时。@Johnlegend2这将拆分任意数量的H列而不指定它们(只要您只有H列),谢谢您的评论。我是否应该有一个选择N列的代码?示例只有H1和H2,但我总共有24个小时。您可以使用
操作符,如
H1:H24
而不是
c(H1,H2)
!或
c(H1:H2)
中的
分隔行()
谢谢您的评论。我应该选择N列的代码吗?示例只有H1和H2,但我总共有24个小时。您可以使用
操作符,如
H1:H24
而不是
c(H1,H2)
!或
c(H1:H2)
中的
分隔行()