Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何通过第二个冒号将字符串拆分为单独的变量?_R_Text_Split - Fatal编程技术网

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

R 如何通过第二个冒号将字符串拆分为单独的变量?,r,text,split,R,Text,Split,我有一个字符串: [1] "x: user1 : value1" [2] ": user2 : value2" [3] ": user2 value3" [4] ": user4 : value4" 我需要通过第二个冒号将用户id拆分为user\u id变量,并将第二个冒号后面的文本拆分为var1变量。 我还需要为每个观察添加一个class变量,如果有两个冒号,则该变量将填充a。如果字符串中没有第二个冒号,那么我需要用b填充class变量 最后我需要的数据帧如下所示: user_id

我有一个字符串:

 [1] "x: user1 : value1"
 [2] ": user2 : value2"
 [3] ": user2 value3"
 [4] ": user4 : value4"
我需要通过第二个冒号将用户id拆分为user\u id变量,并将第二个冒号后面的文本拆分为var1变量。 我还需要为每个观察添加一个class变量,如果有两个冒号,则该变量将填充a。如果字符串中没有第二个冒号,那么我需要用b填充class变量

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

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

使用
substr
在R中是否有一种方便的方法来实现这一点?

我们可以通过使用
sub
仅提取所需的子字符串并使用
read.csv
从字符串的
向量中创建
数据.frame
。我们从字符串的开头(
^
)匹配0个或多个非
[^:]*
)字符,后跟一个
,后跟一个或多个空白字符(
\\s+
),后跟单词(
\\w+
),作为一个组捕获(
(…)
),然后匹配标点符号或空格与第二个单词。在替换中,我们使用反向引用来表示由
分隔的捕获组。它用作
read.csv
的输入,将其作为两列
data.frame
读取。“类”列是使用来自
stringr
包的
stru计数创建的

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
库(stringr)
df1
str1 <- c( "x: user1 : value1", ": user2 : value2", ": user2 value3", ": user4 : value4")