gpt4 book ai didi

regex - 使用tidyr将字符串长度不均匀的行拆分为R中的列

转载 作者:行者123 更新时间:2023-12-04 18:35:17 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Split data frame string column into multiple columns

(15 个回答)


5年前关闭。




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

我试图改变这个:

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

数据表 :
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"))

关于regex - 使用tidyr将字符串长度不均匀的行拆分为R中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35772166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com