【问题标题】:How I can stack this data in R我如何在 R 中堆叠这些数据
【发布时间】:2021-07-13 22:06:45
【问题描述】:

我有 15 个这样的列:

v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 v11 v12 v13 v14 v15
a   b   c   d   e   f   g   h   i   j   k   l   m   n   p

我想按如下方式堆叠: v1 和 v2; v3、v4 和 v5;v6、v7、v8、v9 和 v10; v11,v12 和 v13 , v14 和 v15

结果是

V1  V2  V3  V4  V5
a   b           
c   d   e       
f   g   h   i   J
k   l   m       
n   p

【问题讨论】:

  • 你如何决定 2 然后 3 然后 5 然后 3 然后 2?
  • 你有不止一排吗?
  • 多行的输出结果如何?
  • 您还没有回答如何获得 2 行、3 行、5 行、3 行和 2 行。如果你有一个从 v1 到 v10 的数据框,你会如何堆叠它们?
  • @r2evans 是的。与 15 列一样,OP 具有 10 列的 c(2,3,5,3,2) 行数是多少? c(2,3,3,2)?还是 c(2,6,2)?

标签: r


【解决方案1】:

更新的解决方案 我认为这个解决方案可能会对您有所帮助。如果要将其应用于数据集的每一行,可以将输出存储在列表列中。不过,这个功能还可以进一步完善。

fn <- function(x, lengths) {
  vec <- unname(unlist(x))
  lengths <- lengths
  
  out <- vector("list", length = length(lengths))
  for(i in seq_along(lengths)) {
    out[[i]] <- vec[c(1:lengths[i])]
    vec <- vec[-c(1:lengths[i])]
  }
  
  max_l <- Reduce(function(x, y) max(x, length(y)), out,
                  init = length(out[[1]]))
  
  t(sapply(out, function(x) c(x, rep("", max_l - length(x))))) |>
    as.data.frame()
}
fn(df, c(2, 3, 5, 3, 2))

  V1 V2 V3 V4 V5
1  a  b         
2  c  d  e      
3  f  g  h  i  j
4  k  l  m      
5  n  p  

我们也可以在其他样本数据上进行测试:

structure(list(v1 = "a", v2 = "b", v3 = "c", v4 = "d", v5 = "e", 
    v6 = "f", v7 = "g", v8 = "h", v9 = "i", v10 = "j"), class = "data.frame", row.names = c(NA, 
-1L)) -> df2

> fn(df2, c(2, 6, 2))
  V1 V2 V3 V4 V5 V6
1  a  b            
2  c  d  e  f  g  h
3  i  j  

> fn(df2, c(2, 3, 3, 2))
  V1 V2 V3
1  a  b   
2  c  d  e
3  f  g  h
4  i  j   

【讨论】:

    【解决方案2】:

    虽然没有给出关于如何计算行数的逻辑解释,但这里有一个可以解决这个问题的尝试,在 Base R 中

    my_reshape <- function(dat){
      p <- ncol(dat)
      stopifnot(p>6)
      d <-function(x, p) x * (x + 1) - 2 - p
      e <- round(uniroot(d, c(1,20), p = p)$root)
      if(d(e, p)>0) e <- e - 1
      f <- abs(d(e, p))
      if (f>0 & f< e) {
        e <- e - 1
        f <- abs(d(e, p))
      }
      g <- c(2:e, if(f>=e)f, e:2)
      df <- cbind(stack(dat), time = sequence(g), id = rep(seq_along(g), g))
      res <- reshape(df, dir = 'wide', idvar = 'id', drop = 'ind', sep='_')[,-1]
      rownames(res) <- NULL
      res
    }
    

    现在我们可以这样做了:

    my_solve(df) # 15 columns
      values_1 values_2 values_3 values_4 values_5
    1        a        b     <NA>     <NA>     <NA>
    2        c        d        e     <NA>     <NA>
    3        f        g        h        i        j
    4        k        l        m     <NA>     <NA>
    5        n        p     <NA>     <NA>     <NA>
    
    
    my_solve(df[1:7]) # 7 columns
      values_1 values_2 values_3
    1        a        b     <NA>
    2        c        d        e
    3        f        g     <NA>
    
    my_solve(df[1:10]) # 10 columns
      values_1 values_2 values_3
    1        a        b     <NA>
    2        c        d        e
    3        f        g        h
    4        i        j     <NA>
    
    my_solve(df[1:11]) # 11 columns ie 2, 7, 2 (we can not break it more than this)
      values_1 values_2 values_3 values_4 values_5 values_6 values_7
    1        a        b     <NA>     <NA>     <NA>     <NA>     <NA>
    2        c        d        e        f        g        h        i
    3        j        k     <NA>     <NA>     <NA>     <NA>     <NA>
    
    
    my_solve(df[1:13]) # 13 columns
      values_1 values_2 values_3
    1        a        b     <NA>
    2        c        d        e
    3        f        g        h
    4        i        j        k
    5        l        m     <NA>
    
    my_solve(df[1:14]) # 14 columns
      values_1 values_2 values_3 values_4
    1        a        b     <NA>     <NA>
    2        c        d        e     <NA>
    3        f        g        h        i
    4        j        k        l     <NA>
    5        m        n     <NA>     <NA>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2013-01-16
      • 2020-03-28
      相关资源
      最近更新 更多