参见英文答案 >
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
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 举报,一经查实,本站将立刻删除。