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)
中的分隔行()