This question already has answers here:
Split data frame string column into multiple columns

(15个答案)


4年前关闭。





编辑:这被标记为重复。它不是。这里的问题不仅是将单个列拆分为多个列,因为我的单独代码本来可以工作。我的问题的重点是当行字符串具有不同长度的列输出时拆分列。

我正试图扭转这个:

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")


弦乐:

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][]


纵梁:

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"))

08-04 03:28
查看更多