如何通过第二个冒号将字符串拆分为单独的变量?

时间:2017-02-13 06:59:52

标签: r text split

我有一个字符串:

 [1] "x: user1 : value1"
 [2] ": user2 : value2"
 [3] ": user2 value3"
 [4] ": user4 : value4"

我需要将第二个冒号的用户ID分成 user_id 变量,将第二个冒号后的文本分成 var1 变量。 我还需要为每个观察添加一个变量,如果有两个冒号,将使用 a 填充。如果字符串中没有第二个冒号,那么我需要使用 b 填充变量。

我最后需要的数据框如下所示:

user_id    var1       class
  user1    value1       a
  user2    value2       a
  user2    value3       b
  user4    value4       a

使用substr

在R中有一种方便的方法吗?

1 个答案:

答案 0 :(得分:1)

我们可以通过data.frame并使用vector仅提取所需的子字符串,从sub字符串创建read.csv。我们从字符串的开头(:)开始匹配0个或更多不是[^:]*^)的字符,后跟:后跟一个或多个空格字符(\\s+),后跟单词(\\w+),作为一组((...))捕获,然后匹配标点符号或空格和第二个单词。在替换中,我们使用由,分隔的捕获组的反向引用。它被用作read.csv的输入,将其读为2列data.frame。 “类”列是使用str_count

中的stringr创建的
library(stringr)
df1 <- read.csv(text=sub("^[^:]*:\\s+(\\w+)[[:punct:] ]+(\\w+)", "\\1,\\2", str1), 
    header=FALSE, stringsAsFactors=FALSE, col.names = c("user_id", "var1"))
df1$class <-  c("b", "a")[str_count(str1, ":")]
df1
#  user_id   var1 class
#1   user1 value1     a
#2   user2 value2     a
#3   user2 value3     b
#4   user4 value4     a

数据

str1 <- c( "x: user1 : value1", ": user2 : value2", ": user2 value3", ": user4 : value4")