我如何在 R 中堆叠这些数据

时间:2021-07-13 22:06:45

标签: r

我有 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 个答案:

答案 0 :(得分:3)

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

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   

答案 1 :(得分:1)

虽然没有给出关于如何计算行数的逻辑解释,但这里有一个可以解决这个问题的尝试,在 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>
相关问题