解析字符串中的每个数字,并将其存储在R中的新列中

解析字符串中的每个数字,并将其存储在R中的新列中,r,split,R,Split,下面是我在R中拥有的数据帧中的一个示例行,我正在寻找一种方法,将12个数字中的每一个拆分为自己的列 Pos. Part.: 16 , 18 , 28 , 37 , 64 , 67 Neg. Part.: 11 , 28 , 34 , 41 , 55 , 72 实现这一点的最佳字符串操作函数是什么?谢谢 如果您只需要这些数字,这应该可以: #data: hoc

下面是我在R中拥有的数据帧中的一个示例行,我正在寻找一种方法,将12个数字中的每一个拆分为自己的列

    Pos. Part.: 16       , 18       , 28       , 37       , 64       , 67     Neg. Part.: 11       , 28       , 34       , 41       , 55       , 72


实现这一点的最佳字符串操作函数是什么?谢谢

如果您只需要这些数字,这应该可以:

#data:
hockey <- c("Pos. Part.: 16       , 18       , 28       , 37       , 64       , 67     Neg. Part.: 11")

# define pattern to be matched:
pattern <- "\\d{2}"

# define function to extract raw matches:
extract <- function(x) unlist(regmatches(x, gregexpr(pattern, x, perl = T)))

# extract raw matches:
extract(hockey)
extract
[1] "16" "18" "28" "37" "64" "67" "11"

如果您只需要这些数字,这应该可以:

#data:
hockey <- c("Pos. Part.: 16       , 18       , 28       , 37       , 64       , 67     Neg. Part.: 11")

# define pattern to be matched:
pattern <- "\\d{2}"

# define function to extract raw matches:
extract <- function(x) unlist(regmatches(x, gregexpr(pattern, x, perl = T)))

# extract raw matches:
extract(hockey)
extract
[1] "16" "18" "28" "37" "64" "67" "11"

@Chris的回答巧妙地提取了数字,但我怀疑你的问题在于它合并了Pos和Neg,而你无法将它们分开。如果您总是同时获得Pos和Neg,那么可以使用一个regexpr来获取这两个组。然而,如果你只能得到一个或另一个,那么你就不知道哪一个是通过一个匹配找到的

因此,最稳健的方法是分别搜索Pos和Neg。下面的代码使用了一种称为lookback的
regexpr
技巧。它匹配前面有另一个模式的文本,但另一个模式不包括在匹配中。我们只关注数字(由空格逗号和0-9组成)。因此:


ch@Chris的回答巧妙地提取了数字,但我怀疑你的问题在于它合并了Pos和Neg,而你无法将它们分开。如果您总是同时获得Pos和Neg,那么可以使用一个regexpr来获取这两个组。然而,如果你只能得到一个或另一个,那么你就不知道哪一个是通过一个匹配找到的

因此,最稳健的方法是分别搜索Pos和Neg。下面的代码使用了一种称为lookback的
regexpr
技巧。它匹配前面有另一个模式的文本,但另一个模式不包括在匹配中。我们只关注数字(由空格逗号和0-9组成)。因此:


ch
str\u extract\u all
适用于我的目的,谢谢。我对像
Pos.Part.:
这样的文本部分没有任何用处。可能值得后退一步。所有行的格式都相同吗?有一些读取函数可以处理结构化数据,而无需进行后期处理。数据的来源是什么?文件?鉴于这是一个较大对象中的一行,我建议(正如@David_O所建议的)查看更多上下文可能是有益的。虽然我们可以对您的要求强行给出答案,但这可能不是您所需的最佳答案。@David_O所有行的格式都相同,尽管用逗号分隔的数字数量可能不同。我正在使用
rvest
来获取曲棍球箱的得分,这是数据的来源,例如这个:啊。这很难。表中的该列有各种格式的文本,因此您必须根据具体情况处理不同类型的文本。正则表达式将是您在这里的朋友(
?regexpr
)-如果您在语法有点棘手之前没有使用过它们,那么它们是非常宝贵的(下面的答案就是@chris使用的)(那“\\d”是一个正则表达式。
str\u extract\u all
用于我的目的,谢谢。我不使用像
Pos.Part.:
这样的文本部分。可能值得退一步。所有行的格式都相同吗?有读取函数可以处理结构化数据,而无需后期处理。da的来源是什么ta?一个文件?鉴于这是一个较大对象中的一行,我建议它可能是有益的(正如@David_O所建议的)查看更多上下文。虽然我们可以对您要求的内容强行给出答案,但这可能不是您所需的最佳答案。@David_O所有行的格式都相同,尽管用逗号分隔的数字数量可能不同。我正在使用
rvest
获取曲棍球盒分数,这是考试数据的来源这是一个例子:啊。这很难。表中的那列有各种格式的文本,因此您必须根据具体情况处理不同的文本。正则表达式将是您的朋友(
?regexpr
)-如果您在语法有点棘手之前没有使用过它们,但它们是非常宝贵的(下面的@chris使用的就是这些答案,“\\d”是一个正则表达式。