相关文章推荐
逆袭的板栗  ·  Recursive query or ...·  7 月前    · 
完美的鸵鸟  ·  阿蘇男孩!|JR KYUSHU ...·  7 月前    · 
坐怀不乱的红金鱼  ·  Day 5 - Exploring ...·  8 月前    · 
活泼的芹菜  ·  TLS Setup in MySQL ...·  1 年前    · 

例如我们需要将一下数据的第二列从and处拆分为两列:

before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))

 attr          type
1    1   foo_and_bar
2   30 foo_and_bar_2
3    4   foo_and_bar
4    6 foo_and_bar_2
  attr type_1 type_2
1    1    foo    bar
2   30    foo  bar_2
3    4    foo    bar
4    6    foo  bar_2
  • 使用stringr包的str_split_fixed函数
  • library(stringr)
    str_split_fixed(before$type, "_and_", 2)
    
  • 使用do.call函数 (do.call(what, args, quote = FALSE, envir = parent.frame())
  • before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))  
    out <- strsplit(as.character(before$type),'_and_') 
    do.call(rbind, out)
    
  • 使用tidyr包
  • library(dplyr)
    library(tidyr)
    before <- data.frame(attr = c(1, 30 ,4 ,6 ), type = c('foo_and_bar', 'foo_and_bar_2'))
    before %>% separate(type, c("foo", "bar"), "_and_")
    
  • 使用sapply 以及 "["
  • before$type_1 < sapply(strsplit(as.character(before$type),'_and_'), "[", 1)
    before$type_2 < sapply(strsplit(as.character(before$type),'_and_'), "[", 2)
    
    before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
    after <- with(before, data.frame(attr = attr))
    after <- cbind(after, data.frame(t(sapply(out, `[`))))
    names(after)[2:3] <- paste("type", 1:2, sep = "_")
    
  • 使用unlist后重新划分矩阵
  • before <- data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
    tmp <- matrix(unlist(strsplit(as.character(before$type), '_and_')), ncol=2,byrow=TRUE) #you should show how many columns you would get after spliting
    after <- cbind(before$attr, as.data.frame(tmp))
    names(after) <- c("attr", "type_1", "type_2")