我有一个字符串:
[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
?
答案 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")