在逗号分隔的其他列中添加列的位置列

时间:2018-02-02 19:37:04

标签: r string dataframe dplyr stringr

我有丑陋的数据,如下所示:

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,以及purrr :: map的某些组合来实现,但我无法围绕某些方面进行思考怎么做例如,这肯定不起作用:

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

我已经尝试将其分解为一个函数(使用unlist()和as.list()的各种组合将其转换为满意的格式),但似乎这可能很容易我只是不喜欢的东西。建议?

3 个答案:

答案 0 :(得分:2)

这是一个选项:

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

希望这有帮助!

答案 1 :(得分:2)

一种方法是使用基础rstringr以及mapply作为:

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

答案 2 :(得分:0)

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])