【问题标题】:Concatenation between rows行之间的连接
【发布时间】:2018-04-19 11:27:50
【问题描述】:

我有一个包含两个列的数据框:

C1 <- c("abcd > de > efg", "hij > kl > iiii", "aa", "a > bbb")
C2 <- c("1980","1982","1989","1989")

df <- data.frame(C1, C2, stringsAsFactors = FALSE)

我的目标是像这样连接其中两个的参数:

result <- c("1980abcd > 1980de > 1980efg", "1982hij > 1982kl > 1982iiii", "1989aa", "1989a > 1989bbb")

我该怎么做?谢谢。

【问题讨论】:

    标签: r string-concatenation data-manipulation


    【解决方案1】:

    通过base R的一种方法是使用拆分C1向量并使用mapply粘贴C2,即

    v1 <- mapply(function(x, y) paste(paste0(x, y), collapse = ' > '), C2, strsplit(C1, ' > '))
    
    unname(v1)
    #[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii" "1989aa"   "1989a > 1989bbb"
    

    注意:mapply(即v1)的结果是一个命名向量。因此我使用unname 来达到您想要的结构。但是,请注意,命名向量仍然是一个向量,并且会表现得如此。

    【讨论】:

      【解决方案2】:

      这是一种不需要拆分每个字符串并重新粘贴在一起的方法:

      mapply(function(x,y) gsub("(^|\\s)(?=[a-z]+)",  paste0("\\1", y), x, perl = TRUE), 
                           df$C1, df$C2, USE.NAMES = FALSE)
      #[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii"
      #[3] "1989aa"                      "1989a > 1989bbb" 
      

      正则表达式模式(^|\\s)(?=[a-z]+) 匹配字符串的开头或后跟小写字符的空格,然后将其替换为相应的 C2 条目。


      这是一个 purrr 替代方案:

      library(purrr)
      strsplit(df$C1, " > ") %>% map2_chr(df$C2, ~paste(.y, .x, sep = "", collapse=" > "))
      #[1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii"
      #[3] "1989aa"                      "1989a > 1989bbb" 
      

      【讨论】:

      • 不错的一个。我也试过了,但我是 regex-blind :)
      • @Sotos,谢谢,花了一些时间才弄清楚,但这很有趣。
      【解决方案3】:

      使用 strsplit,应用和粘贴:

          library(dplyr)
          df <- tibble(C1=strsplit(C1," > "),C2)
      
          res <- unlist(apply(df,1,function(y){paste(paste(x$C2,x$C1,sep=""),collapse=" > ")}))
          # [1] "1980abcd > 1980de > 1980efg" "1982hij > 1982kl > 1982iiii" "1989aa"                     
          # [4] "1989a > 1989bbb" 
      

      【讨论】:

      • 你为什么加载dplyr只是为了做一个小标题?数据框有什么问题?
      • 数据帧没有问题。我只是习惯使用 tibbles
      猜你喜欢
      • 2017-12-15
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 2021-03-18
      • 2019-10-27
      相关资源
      最近更新 更多