使用tidyr将字符串长度不均匀的行拆分为R中的列[重复]

Posted

技术标签:

【中文标题】使用tidyr将字符串长度不均匀的行拆分为R中的列[重复]【英文标题】:Splitting rows with uneven string length into columns in R using tidyr [duplicate] 【发布时间】:2016-06-16 18:40:54 【问题描述】:

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

我正在尝试改变这个:

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 

我需要进行哪些更改才能使其正常工作?

【问题讨论】:

字符串长度不均匀到底是什么意思?如果您想选择破折号之间的内容,请尝试: [^-]+ as your regex 我认为这里的“不均匀”=“未知”:) @Someone 是的,我指的是输出列。我尝试了您的建议,警告变为“警告消息:1 个位置的值过多:2” 【参考方案1】:

您正确指定了目标列:

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

字符串i

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

【讨论】:

感谢您的回答!这很好用,如果解决方案是tidyr,那就太好了。 @JnrfL 查看更新后的答案,HTH

以上是关于使用tidyr将字符串长度不均匀的行拆分为R中的列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

R 使用 tidyr::separate 在最后一个空格字符处拆分字符串

通过R中的列的cumsum拆分data.table

随机长度字符串近似均匀拆分

将包含列表的列拆分为熊猫中的不同行[重复]

将二进制字符串拆分为长度为 n 的子字符串,然后解码 R 中的每个子字符串

如何将字符串拆分为视图的列? [复制]