在数据框列中查找特定标记,并在单独的列中将标记添加到同一数据框中

时间:2012-07-17 11:33:45

标签: r grep dataframe

我使用了回复上一个问题的用户的R代码(请参阅此处:Split values of a column in a data frame by specific tag and add them as extra row) 实现以下目标:

df <- data.frame(var1 = c("A", "B", "C", "D", "E"),            

             var2 = c("test", "5 | 6", "X & Y", "M | N | O", "none"))

> df         
  var1          var2
1    A          test
2    B         5 | 6
3    C         X & Y
4    D     M | N | O
5    E          none


t1 <- c("", "|")[df$var1 %in% df$var1[grep("\\|", df$var2)]+1]

t2 <- c("", "&")[df$var1 %in% df$var1[grep("&", df$var2)]+1]

t1[which(t2 == "&")] <- "&"

df$var3 <- t1


> df
  var1          var2     var3
1    A          test     
2    B         5 | 6        |
3    C         X & Y        &
4    D     M | N | O        |
5    E          none     

我只是想知道是否有更好的方法,因为我真的想改进我的R编码方式。对我来说,这不是一个简单的任务,但我愿意学习: - )

4 个答案:

答案 0 :(得分:2)

假设您的数据确实非常有条理,间距适当等,您可以使用gsubsubstring

df$var3 = substring(gsub("([a-zA-Z0-9 ])", "", df$var2), 1, 1)
df
#   var1      var2 var3
# 1    A      test     
# 2    B     5 | 6    |
# 3    C     X & Y    &
# 4    D M | N | O    |
# 5    E      none
  1. 对于您的搜索模式,请查找所有字母,数字和空格,并将其替换为空。
  2. 然后,将substring(或substr)与startstop一起用作1
  3. 更新

    假设var2中可能有不同的标点符号,更常规的方法是:

    gsub("[^[:punct:]]", "", df$var2)
    # [1] ""   "|"  "&"  "||" ""  
    

    同样,使用substr将允许您只选择每个字符串中的第一个字符。

    substr(gsub("[^[:punct:]]", "", df$var2), 1, 1)
    # [1] ""  "|" "&" "|" "" 
    

    如果您肯定只有这两个分隔字符,则可以将搜索模式从[^[:punct:]]更改为[^\\||\\&]

    在此更新的示例中,^(在方括号内)表示匹配所有这些字符。

答案 1 :(得分:1)

您可以改用:

t3 <- rep("",length(df$var1))
t3[which(grepl("&",df$var2))] <- "&"
t3[which(grepl("\\|",df$var2))] <- "|"
df$var3 <- t3

答案 2 :(得分:0)

grepl("\\|",df$var2)
grepl("&",df$var2)

相同
df$var1 %in% df$var1[grep("\\|", df$var2)]
df$var1 %in% df$var1[grep("&", df$var2)]+1

所以你可以使用例如

ifelse(grepl("\\|",df$var2),'|','')
ifelse(grepl("&",df$var2),'&','')

答案 3 :(得分:0)

我找到了另一种解决方案,它对我来说只对一行很有用: - )

library(stringr)

df$var3 <- str_extract(df$var2, "\\||&")

但是,我不得不说我不关心代码添加到没有匹配的地方。

感谢您提供所有解决方案!确实很棒!