使用 tidyr 将字符串长度不均匀的行拆分为 R 中的列
Splitting rows with uneven string length into columns in R using tidyr
编辑:这被标记为重复。它不是。这里的问题不仅仅是将单个列拆分为多个列,因为我的单独代码会起作用。我的问题的要点是当行字符串具有不同长度的列输出时拆分列。
我正在尝试打开这个:
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", sep="-", 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",
"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"))
编辑:这被标记为重复。它不是。这里的问题不仅仅是将单个列拆分为多个列,因为我的单独代码会起作用。我的问题的要点是当行字符串具有不同长度的列输出时拆分列。
我正在尝试打开这个:
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", sep="-", 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",
"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"))