gpt4 book ai didi

regex - R:从字符串中删除最后三个点

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

我有一个文本数据文件,可能会用readLines读取。每个字符串的开头部分包含大量乱码,后面跟着我需要的数据。乱码和数据通常由三个点分隔。我想在最后三个点之后分割字符串,或用某种标记替换最后三个点,以告诉R将这三个点左侧的所有内容都视为一列。

这是Stackoverflow上类似的帖子,它将找到最后一个点:

R: Find the last dot in a string

但是,在我的情况下,某些数据使用小数,因此仅找到最后一个点是不够的。另外,我认为...在R中具有特殊含义,这可能会使问题变得更加复杂。另一个潜在的复杂性是某些点大于其他点。同样,在某些行中,三个点之一被逗号替换。

除了以上文章中的gregexpr之外,我还尝试使用gsub,但无法找出解决方案。

这是一个示例数据集以及我希望实现的结果:

aa = matrix(c(
'first string of junk... 0.2 0 1',
'next string ........2 0 2',
'%%%... ! 1959 ... 0 3 3',
'year .. 2 .,. 7 6 5',
'this_string is . not fine .•. 4 2 3'),
nrow=5, byrow=TRUE,
dimnames = list(NULL, c("C1")))

aa <- as.data.frame(aa, stringsAsFactors=F)
aa

# desired result
# C1 C2 C3 C4
# 1 first string of junk 0.2 0 1
# 2 next string ..... 2 0 2
# 3 %%%... ! 1959 0 3 3
# 4 year .. 2 7 6 5
# 5 this_string is . not fine 4 2 3

我希望这个问题不要太具体了。文本数据文件是使用昨天从我的帖子中概述的有关读取R中的MSWord文件的步骤创建的。

有些行不包含乱码或三个点,而仅包含数据。但是,这可能会使后续帖子变得复杂。

感谢您的任何建议。

最佳答案

这可以达到目的,尽管不是特别优雅。

options(stringsAsFactors = FALSE)


# Search for three consecutive characters of your delimiters, then pull out
# all of the characters after that
# (in parentheses, represented in replace by \\1)
nums <- as.vector(gsub(aa$C1, pattern = "^.*[.,•]{3}\\s*(.*)", replace = "\\1"))

# Use strsplit to break the results apart at spaces and just get the numbers
# Use unlist to conver that into a bare vector of numbers
# Use matrix(, nrow = length(x)) to convert it back into a
# matrix of appropriate length
num.mat <- do.call(rbind, strsplit(nums, split = " "))


# Mash it back together with your original strings
result <- as.data.frame(cbind(aa, num.mat))

# Give it informative names
names(result) <- c("original.string", "num1", "num2", "num3")

关于regex - R:从字符串中删除最后三个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127010/

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