【问题标题】:Find multiple partial strings in each row and create a variable with the column the string is in在每一行中查找多个部分字符串,并使用字符串所在的列创建一个变量
【发布时间】:2021-11-25 08:12:41
【问题描述】:

我发现了类似的问题,但还没有解决我的问题。 我有一个巨大的数据框,我试图找到出现一系列字符串的位置。 这是我的示例数据:

var1 <- c("Goats","Sheep","Pigs","Dog","Zebu","Donkeys","Water buffaloes","Dromedary camel","Dog","Pig")
var2 <- c("cats","Dog","birds","rabbits","Plant","fish","guinea pigs","cat","Mouse","dog")
var3 <- c("cats","Dog","birds","rabbits","horses","Sheep","Pigs","Tree","Zebu","Donkeys")
var4 <- c("Plant","Ant","Bee","Tree","Water buffaloes","Donkeys","Water buffaloes","Dromedary camel","Dog","Pig")

df <- data.frame(var1, var2, var3, var4)

head(df)
    var1    var2    var3            var4
1   Goats    cats    cats           Plant
2   Sheep     Dog     Dog             Ant
3    Pigs   birds   birds             Bee
4     Dog rabbits rabbits            Tree
5    Zebu   Plant  horses Water buffaloes
6 Donkeys    fish   Sheep         Donkeys
> 

我可以找到每棵树和植物出现的行和列:

strings = c( "Tree","Plant")

which(apply(df, 1, function(x) any(grepl(paste(strings, collapse = "|"), x))))# ROW
[1] 1 4 5 8

which(apply(df, 2, function(x) any(grepl(paste(strings, collapse = "|"), x)))) # COLUMN
var2 var3 var4 
   2    3    4 

但不知道如何将列名(或索引)放入每一行的新变量中。这就是我想要的:

> head(df)
     var1    var2    var3            var4     x1
1   Goats    cats    cats           Plant     var4
2   Sheep     Dog     Dog             Ant     NA
3    Pigs   birds   birds             Bee     NA 
4     Dog rabbits rabbits            Tree     var4
5    Zebu   Plant  horses Water buffaloes     var2
6 Donkeys    fish   Sheep         Donkeys     NA

我认为 str_detect 或 str_which 可以,但不确定如何在所有列中执行此操作。 比如:

df <- df %>%
  mutate(words = ifelse(any_vars(str_detect(strings))))

感谢您的时间和帮助。

【问题讨论】:

    标签: r regex dplyr stringr


    【解决方案1】:

    我们可以通过rowwise 实现这一点-

    library(dplyr)
    
    cols <- names(df)
    
    df %>%
      rowwise() %>%
      mutate(x1 = toString(cols[c_across() %in% strings])) %>%
      ungroup
    
    #   var1            var2        var3    var4            x1    
    #   <chr>           <chr>       <chr>   <chr>           <chr> 
    # 1 Goats           cats        cats    Plant           "var4"
    # 2 Sheep           Dog         Dog     Ant             ""    
    # 3 Pigs            birds       birds   Bee             ""    
    # 4 Dog             rabbits     rabbits Tree            "var4"
    # 5 Zebu            Plant       horses  Water buffaloes "var2"
    # 6 Donkeys         fish        Sheep   Donkeys         ""    
    # 7 Water buffaloes guinea pigs Pigs    Water buffaloes ""    
    # 8 Dromedary camel cat         Tree    Dromedary camel "var3"
    # 9 Dog             Mouse       Zebu    Dog             ""    
    #10 Pig             dog         Donkeys Pig             ""    
    

    在基础 R 中,apply -

    df$x1 <- apply(df, 1, function(x) toString(cols[x %in% strings]))
    

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多