【问题标题】:Transpose whole dataframe into one row dataframe- (or transposing each row of data.table and column binding)将整个数据框转置为一行数据框-(或转置每一行 data.table 和列绑定)
【发布时间】:2018-07-12 04:02:49
【问题描述】:

我尝试在库 reshape 和 data.table 的帮助下转换 my_dataset 以实现 result.dataset 但尚未成功。

我有一个数据表my_dataset,看起来像这样:-

A    X     Count
id1  b     1
id1  c     2

我想要result.dataset 应该是这样的:-

 A   X1  Count1  X2  Count2  
 id1  b    1      c    2

如果有人可以帮助我获得上述result.dataset,那就太好了,最好使用reshapedata.table(或两者都使用lib)。

【问题讨论】:

    标签: r data.table reshape reshape2


    【解决方案1】:

    这是一个仅使用 reshape2 的解决方案(试图坚持使用建议的软件包)。它首先添加一列rep,允许调用dcast

    require(reshape2)
    
    #adding rep
    my_dataset$rep = unlist(tapply(my_dataset$A, my_dataset$A, function(x)1:length(x)))
    
    #cast at work
    C1 = dcast(my_dataset, A ~ paste('X',rep, sep=''), value.var='X')
    C2 = dcast(my_dataset, A ~ paste('Count',rep, sep=''), value.var='Count')
    
    result.dataset = cbind(C1, C2[,-1])
    

    但列的顺序与您的示例不同。

    【讨论】:

      【解决方案2】:

      试试这个:

      dt <- read.table(text = 'A    X     Count
      id1  b     1
      id1  c     2',header=T)
      a <- aggregate(.~A, dt, paste, collapse=",")
      library(splitstackshape)
      result <- concat.split.multiple(data = a, split.cols = c("X","Count"), seps = ",")
      

      输出:

      > result
      A X_1 X_2 Count_1 Count_2
      1: id1   b   c       1       2
      

      【讨论】:

        【解决方案3】:

        我们可以聚合这些行并使用cSplit 来拆分它们。

        library(data.table)
        library(splitstackshape)
        
        dat2 <- setDT(dat)[, lapply(.SD, paste, collapse = ","), by = A]
        
        cols <- c(names(dat[, 1]), paste(names(dat[, -1]), 
                                         rep(1:nrow(dat), each = nrow(dat), 
                                         sep = "_"))
        
        cSplit(dat2, splitCols = names(dat[, -1]))[, cols, with = FALSE]
        #      A X_1 Count_1 X_2 Count_2
        # 1: id1   b       1   c       2
        

        数据

        dat <- read.table(text = "A    X     Count
        id1  b     1
        id1  c     2",
                          header = TRUE, stringsAsFactors = FALSE)
        

        【讨论】:

        • 你是天才,这真的很有帮助;但是我们是否也有一些解决方法,我们可以自动重新排序结果数据集,就像它在我的帖子中一样?就像使用 data.table 库中的链操作一样。再次感谢:)
        • @MukundJha 请查看我的更新。我准备了一个名为cols 的向量,其中包含dat2 中具有正确顺序的列名。这可能不优雅,但我认为即使你有很多列要拆分,它也会起作用。此外,splitCols = names(dat[, -1]) 允许我们在不指定列名的情况下拆分列。
        猜你喜欢
        • 2018-01-27
        • 2014-06-19
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        相关资源
        最近更新 更多