微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式 – 使用tidyr 将具有不均匀字符串长度的行拆分为R中的列

参见英文答案 > Split data frame string column into multiple columns                                    15个
编辑:这被标记为重复.它不是.这里的问题不仅仅是将单个列拆分为多个列,因为我的单独代码会起作用.我的问题的要点是当行字符串具有不同长度的列输出时拆分列.

我试图改变这个:

data <- c("Place1-Place2-Place2-Place4-Place2-Place3-Place5","Place7-Place7-Place7-Place7-Place7-Place7-Place7-Place7","Place1-Place1-Place1-Place1-Place3-Place5","Place1-Place4-Place2-Place3-Place3-Place5-Place5","Place6-Place6","Place1-Place2-Place3-Place4")

进入:

X1     X2     X3     X4     X5     X6     X7     X8
1 Place1 Place2 Place2 Place4 Place2 Place3 Place5 
2 Place7 Place7 Place7 Place7 Place7 Place7 Place7 Place7
3 Place1 Place1 Place1 Place1 Place3 Place5 
4 Place1 Place4 Place2 Place3 Place3 Place5 Place5 
5 Place6 Place6 
6 Place1 Place2 Place3 Place4

我尝试使用此代码使用tidyr的单独函数

library(data.table)
data <- as.data.table(data)
data_table <- tidyr::separate(data,data,sep="-",into = strsplit(data$data,"-"),fill = "right")

可悲的是我收到了这个错误

Warning message:
Too many values at 3 locations: 1,2,4

我需要更改什么才能使其正常工作?

解决方法

您可以正确指定目标列:

library(tidyr)
separate(DF,V1,paste0("X",1:8),sep="-")

这使:

X1     X2     X3     X4     X5     X6     X7     X8
1 Place1 Place2 Place2 Place4 Place2 Place3 Place5   <NA>
2 Place7 Place7 Place7 Place7 Place7 Place7 Place7 Place7
3 Place1 Place1 Place1 Place1 Place3 Place5   <NA>   <NA>
4 Place1 Place4 Place2 Place3 Place3 Place5 Place5   <NA>
5 Place6 Place6   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>
6 Place1 Place2 Place3 Place4   <NA>   <NA>   <NA>   <NA>

如果您事先不知道需要多少目标列,可以使用:

> max(sapply(strsplit(as.character(DF$V1),'-'),length))
[1] 8

提取最大数量的部件(因此是您需要的列数).

其他几种方法

splitstackshape:

library(splitstackshape)
cSplit(DF,"V1",direction = "wide")

stringi:

library(stringi)
as.data.frame(stri_list2matrix(stri_split_fixed(DF$V1,byrow = TRUE))

data.table:

library(data.table)
setDT(DF)[,paste0("v",1:8) := tstrsplit(V1,"-")][,V1 := NULL][]

stringr:

library(stringr)
as.data.frame(str_split_fixed(DF$V1,"-",8))

这些都给出了类似的结果.

使用数据:

DF <- data.frame(V1=c("Place1-Place2-Place2-Place4-Place2-Place3-Place5","Place1-Place2-Place3-Place4"))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐