将在匹配字符中找到的字符串移动到R中的新列

时间:2018-07-11 17:57:46

标签: r string grep

我有一组数据格式如下:

01: <00-00-00> foo bar <00-00-01>
02: <00-00-01> bar foo <00-00-02>

我想用grep剪掉首字母

: <xyz>

尖括号字符串,并将其放在称为V2的新列中。最后

<xyz>
每行上的

尖括号字符串也应放在新列V3中。

在这些括号中找到的字符串是可变的;我想捕获它们,无论它们的性质如何,只要在打开和关闭尖括号之间找到它们即可。每行的第一个放在方括号中的字符串通过在后面加上“:”来区分。我尝试使用此方法,但不起作用:

data$timestamp.start <- grep("\\: <[^\\>]*\\>", as.character(data$V2), perl = TRUE)

2 个答案:

答案 0 :(得分:1)

这应该做到。只能使用捕获和字符类,这确实有点束手无策:

 df1223 <- data.frame(V1=c("01: <00-00-00> foo bar <00-00-01>",
                           "02: <00-00-01> bar foo <00-00-02>"), 
                      stringsAsFactors=FALSE)

 df1223$V2 <- sub("^[^<]+([<][^>]+[>]).+$", "\\1", df1223$V1)
 df1223$V3 <- sub("^[^<]+[<][^>]+[>][^<]+([<][^>]+[>]).?$", "\\1", df1223$V1)
 df1223
#-----------
                                 V1         V2         V3
1 01: <00-00-00> foo bar <00-00-01> <00-00-00> <00-00-01>
2 02: <00-00-01> bar foo <00-00-02> <00-00-01> <00-00-02>

您将“读取”第一个模式作为跨所有非“ <”的传递,然后将第一个“ <”和所有下一个非“>”字符以及下一个“>”放入标记为的捕获类中“ \ 1”。然后,所有其余的到字符串末尾的内容都将超出该捕获类。然后sub仅返回捕获类中的内容。对sub的下一次调用只是以类似的模式重复该过程以找到第二个包含的字符串,但使用“?”而不是“ +”,因为捕获类的结尾之后可能没有任何字符。

答案 1 :(得分:0)

让我们说您具有以下数据框。

df1223 <- structure(list(V1=c("01: <00-00-00> foo bar <00-00-01>"),V2=c("02: <00-00-01> bar foo <00-00-02>")),V3='NULL', class = ("data.frame"))

现在您可以获取第一个<>之间的数据了:

gsub("([0-9]+: )(<[^>]*)(>)(.*)","\\2\\3",df1223$V1)

要获取<>之间的第二组字符串,请使用以下命令。

gsub("([0-9]+: )(<[^<]*)(<.*>)","\\3",df1223$V1)

说实话,由于我也正在学习R,所以我花了很多时间在如何插入数据框中的方法上,我也做不到,如果你知道那可以帮到你。