【问题标题】:R: transposing and splitting a row with a delimiter.R:用分隔符转置和分割一行。
【发布时间】:2015-03-22 20:32:04
【问题描述】:

我有一张桌子

rawData <- as.data.frame(matrix(c(1,2,3,4,5,6,"a,b,c","d,e","f"),nrow=3,ncol=3))

 1  4 a,b,c
 2  5   d,e
 3  6     f

我想转换成

1  2  3
4  5  6
a  d  f
b  e
c

到目前为止,我可以转置和拆分第三列,但是,我不知道如何用上面的格式大纲重建一个新表?

new = t(rawData)

for (e in 1:ncol(new)){
  s<-strsplit(new[3:3,e], split=",")
  print(s)
}

我尝试为每次迭代创建新向量,但我不确定如何有效地将每个向量放回数据框中。将不胜感激任何帮助。谢谢!

【问题讨论】:

    标签: r reshape transpose


    【解决方案1】:

    您可以使用stringi 包中的stri_list2matrix

    library(stringi)       
    rawData <- as.data.frame(matrix(c(1,2,3,4,5,6,"a,b,c","d,e","f"),nrow=3,ncol=3),stringsAsFactors = F)
    
    d1 <- t(rawData[,1:2])
    rownames(d1) <- NULL
    
    d2 <- stri_list2matrix(strsplit(rawData$V3,split=','))
    
    rbind(d1,d2)  
    #    [,1] [,2] [,3]
    # [1,] "1"  "2"  "3" 
    # [2,] "4"  "5"  "6" 
    # [3,] "a"  "d"  "f" 
    # [4,] "b"  "e"  NA  
    # [5,] "c"  NA   NA  
    

    【讨论】:

    • 类似plyr::rbind.fill
    • 单线 rbind( unname(t(rawData[-3])), stri_split_fixed(rawData$V3, ",", simplify="array") ) :-)
    • 谢谢,这很聪明,而且完全有效!对我的新手技能很有意义;)
    • 关于我的最后一个,从文档中它应该是simplify=NA,而不是"array"。不知道为什么“数组”有效
    • @RichardScriven,simplify="array" 不适合我
    【解决方案2】:

    您也可以使用我的“splitstackshape”包中的cSplit

    默认情况下,它只是在拆分输入后创建额外的列:

    library(splitstackshape)
    cSplit(rawData, "V3")
    #    V1 V2 V3_1 V3_2 V3_3
    # 1:  1  4    a    b    c
    # 2:  2  5    d    e   NA
    # 3:  3  6    f   NA   NA
    

    您可以将其转置以获得所需的输出。

    t(cSplit(rawData, "V3"))
    #      [,1] [,2] [,3]
    # V1   "1"  "2"  "3" 
    # V2   "4"  "5"  "6" 
    # V3_1 "a"  "d"  "f" 
    # V3_2 "b"  "e"  NA  
    # V3_3 "c"  NA   NA
    

    【讨论】:

    • 也许将t 作为态度参数添加到cSplit
    • @DavidArenburg,功能膨胀? (我也不知道为什么有人会希望他们的数据采用这种形式,这就是为什么我也留下了原始输出(实际上仍然是可用的形式......)
    • 我猜它像stri_list2matrix byrow 参数?
    • @DavidArenburg,这有点不同,因为它在一个可以独立于data.frame 的输入向量上运行,而cSplit 专门用于拆分data.frame 中的列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2015-10-06
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多