【问题标题】:Add Column of Position of Column in Comma-Separated Other Column在逗号分隔的其他列中添加列的位置列
【发布时间】:2018-07-13 08:55:23
【问题描述】:

我有看起来像这样的丑陋数据:

source_data <- data.frame(thing = c('C', 'E', 'G'), ugly_sequence_string = c('A,B,C', 'D,E,F', 'G,H,I'))

我想在ugly_sequence_string中添加一个东西的整数位置的列:

target_data <- data.frame(thing = c('C', 'E', 'G'), position = c(3L, 2L, 1L))

我觉得这必须通过 strsplit(或 stringr::str_split)、dplyr::mutate、which 和 purrr::map 的某种组合来实现,但我未能围绕某些方面思考如何做到这一点。例如,这绝对行不通:

source_data %>% 
  dplyr::mutate(
    position = which(stringr::str_split(ugly_sequence_string, ',') == thing)
  )

我已经尝试将其分解为一个函数(使用 unlist() 和 as.list() 的各种组合以将其转换为满意的格式),但这似乎很容易我只是没有摸索的东西。有什么建议吗?

【问题讨论】:

    标签: r string dataframe dplyr stringr


    【解决方案1】:

    这是一种选择:

    source_data$index <- sapply(1:nrow(source_data), function(x) {which(
           strsplit(source_data$ugly_sequence_string[x],',')[[1]]==source_data$thing[x])})
    

    输出:

      thing ugly_sequence_string index
    1     C                A,B,C     3
    2     E                D,E,F     2
    3     G                G,H,I     1
    

    希望这会有所帮助!

    【讨论】:

    • 使用 strsplit 时出现错误:strsplit(source_data$ugly_sequence_string[x], ",") 中的错误:非字符参数但是当我切换到 stringr::str_split 时它可以工作,所以就可以了!这就是我在有意义的时候忘记回到基础 R 的结果:)
    • 嗨@Jon,可能是您的列是类因素而不是类字符。 strsplit 接受一个字符向量,而str_split 接受“一个字符向量,或者可以强制转换的东西”。 Anway,很高兴您的问题得到解决!
    • 啊,是的,这就是问题所在。做测试数据的时候没注意,当然和我的真实数据不完全一样..但是我的真实数据有整数,所以意识到差异很好!
    • 对不起,伙计。我的回答与你的类似。发帖后才知道。
    • 没问题,很好的解决方案;)
    【解决方案2】:

    一种方法是使用基本的rstringrmapply 作为:

    source_data <- data.frame(thing = c('C', 'E', 'G'), 
                     ugly_sequence_string = c('A,B,C', 'D,E,F', 'G,H,I'))
    
    library(stringr)
    #Function to perform search
    find_thing <- function(x, y){
      which(stringr::str_split(x, ',') [[1]] == y)
    }
    
    source_data$position <- mapply(find_thing, 
                                   source_data$ugly_sequence_string, source_data$thing)
    
    Result:
    > source_data
      thing ugly_sequence_string position
    1     C                A,B,C        3
    2     E                D,E,F        2
    3     G                G,H,I        1
    

    【讨论】:

      【解决方案3】:
      transform(d,here=mapply(function(x,y)regexpr(x,gsub(",","",y))[[1]],d$thing,d$ugl))
        thing ugly_sequence_string here
      C     C                A,B,C    3
      E     E                D,E,F    2
      G     G                G,H,I    1
      

      甚至:

       here=mapply(function(x,y)match(x,strsplit(y,",")[[1]]),d[,1],d[,2])
      

      【讨论】:

      • 我不想拆分丑陋的序列字符串,我需要一个整数来告诉我丑陋序列字符串中事物的位置。
      猜你喜欢
      • 2020-05-08
      • 2012-01-24
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多