【问题标题】:Match strings with key dataframe and assign a value将字符串与关键数据框匹配并赋值
【发布时间】:2018-03-08 18:02:37
【问题描述】:

我正在处理R 中的一些文本,我想完成一项任务,将一个数据帧中的字符串与保存在其他数据帧中的字符串进行比较,并在巧合时在第一个数据帧中分配一个值。我的初始数据框是DF1

DF1 <- data.frame(v1=c("A cat in sun", "A silver arrow", "A deep sun"), v2=c(1,2,3),stringsAsFactors=F)

其中v1 是用来做对比的文本变量。 DF2 是保存文本链以进行比较的数据框:

DF2 <- data.frame(key = c("arrow|spyder|car", "cat|met|shoe", "sun|moon|earth"), value = c("D","M", "A"), stringsAsFactors=F) 

然后,必须使用来自DF2v1keyDF1 中的每一行进行比较以分配value。我已经使用grepl 进行了测试,仅使用以下值:

grepl("cat|met|shoe", "A cat in sun")

这可行,但问题是当我尝试在DF1 中使用相同的逻辑时,结构如下:

DF1$Var <- DF2[grepl(DF2$key, DF1$v1), "value"]

我无法得到预期的结果:

DF3 <- data.frame(v1=c("A cat in sun", "A silver arrow", "A deep sun"), v2=c(1,2,3), Var = c("M", "D", "A"),stringsAsFactors=F)

【问题讨论】:

    标签: r regex dataframe


    【解决方案1】:
    df1$Var <- lapply(df1$v1, function(x) 
      df2[min(which(lapply(df2$key, function(y) grepl(y,x))==T)),"value"])
    df1
    

    输出为:

                  v1 v2 Var
    1   A cat in sun  1   M
    2 A silver arrow  2   D
    3     A deep sun  3   A
    

    样本数据:

    df1 <- structure(list(v1 = c("A cat in sun", "A silver arrow", "A deep sun"
    ), v2 = c(1, 2, 3)), .Names = c("v1", "v2"), row.names = c(NA, 
    -3L), class = "data.frame")
    
    df2 <- structure(list(key = c("arrow|spyder|car", "cat|met|shoe", "sun|moon|earth"
    ), value = c("D", "M", "A")), .Names = c("key", "value"), row.names = c(NA, 
    -3L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      假设您要分配第一个可能的value(例如,M 由于“cat”而分配给第一行,而不是由于“sun”而分配A),那么我们也可以简单地写

      for(i in nrow(DF2):1)
        DF1$value[grep(DF2$key[i], DF1$v1)] <- DF2$value[i]
      

      【讨论】:

        【解决方案3】:

        我的一个班轮解决方案。

        library(fuzzyjoin)
        
        DF1 %>% regex_inner_join(DF2, by = c(v1 = "key"))  %>% select(v1,v2,value)  %>% filter (! duplicated(v1))  %>% dplyr::rename(Var = value)
        

        结果

                 v1       v2    Var
           A cat in sun   1      M
         A silver arrow   2      D
             A deep sun   3      A
        

        【讨论】:

          猜你喜欢
          • 2017-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 2022-01-07
          • 1970-01-01
          • 2019-06-21
          相关资源
          最近更新 更多