gpt4 book ai didi

r - 分割字符串而不丢失字符 - R

转载 作者:行者123 更新时间:2023-12-01 16:19:01 25 4
gpt4 key购买 nike

我在一个更大的数据框中有两列,我很难分割它们。过去,当我尝试使用“空格”、“,”或其他分隔符进行分割时,我曾使用过 strsplit 。这里最困难的部分是我不想丢失任何信息,当我分割某些部分时,我最终会丢失信息。我想最终得到四列。这是我现在拥有的几行内容的示例。

age-gen  surv-camp
45M 1LC
9F 0
12M 1AC
67M 1LC

这是我最终想要得到的。

age   gen   surv   camp
45 M 1 LC
9 F 0
12 M 1 AC
67 M 1 LC

我在这里做了很多搜索,并在 Java、C++、html 等中找到了许多响​​应,但我还没有找到任何解释如何在 R 中执行此操作以及当您有缺少数据。

我看到了this关于在值之间添加空格,然后在空格上进行分割,但我不知道这将如何工作 1) 缺少数据,2) 当我在每行中没有一致的数字或字符值时。

最佳答案

我们循环遍历“df1”的列 (lapply(df1, ..),使用 sub 在数字子字符串后创建分隔符,读取 向量作为带有read.table的data.frame,rbinddata.frameslist和更改输出的列名称。

res <- do.call(cbind, lapply(df1, function(x)
read.table(text=sub("(\\d+)", "\\1,", x),
header=FALSE, sep=",", stringsAsFactors=FALSE)))
colnames(res) <- scan(text=names(df1), sep=".", what="", quiet = TRUE)
res
# age gen surv camp
#1 45 M 1 LC
#2 9 F 0
#3 12 M 1 AC
#4 67 M 1 LC
<小时/>

或者使用 separatetidyr

library(tidyr)
library(dplyr)
separate(df1, age.gen, into = c("age", "gen"), "(?<=\\d)(?=[A-Za-z])", convert= TRUE) %>%
separate(surv.camp, into = c("surv", "camp"), "(?<=\\d)(?=[A-Za-z])", convert = TRUE)
# age gen surv camp
#1 45 M 1 LC
#2 9 F 0 <NA>
#3 12 M 1 AC
#4 67 M 1 LC
<小时/>

或者正如@Frank提到的,我们可以使用data.table中的tstrsplit

library(data.table)
setDT(df1)[, unlist(lapply(.SD, function(x)
tstrsplit(x, "(?<=[0-9])(?=[a-zA-Z])", perl=TRUE,
type.convert=TRUE)), recursive = FALSE)]

编辑:在separate中添加了convert = TRUE以更改拆分后列的type

数据

df1 <- structure(list(age.gen = c("45M", "9F", "12M", "67M"), surv.camp = c("1LC", 
"0", "1AC", "1LC")), .Names = c("age.gen", "surv.camp"),
class = "data.frame", row.names = c(NA, -4L))

关于r - 分割字符串而不丢失字符 - R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428474/

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