代码之家  ›  专栏  ›  技术社区  ›  Whilux

在R中将行变量用作列

  •  1
  • Whilux  · 技术社区  · 7 年前

    我有以下数据:

    split2 <-read.csv("C:\\Users\\Liz\\Desktop\\R text editing\\looped\\splitne.csv")
    split2
    

    TYPE VALUE Ne 6 CI95(L) 3 CI95(U) 21 Ne 6 CI95(L) 3 CI95(U) 21 Ne 6 CI95(L) 3 CI95(U) 21 Ne 6 CI95(L) 3 CI95(U) 21

    我想使用R将其转换为以下格式:

    Ne CI95(L) CI95(U) 6 3 21 6 3 21 6 3 21 6 3 21 我已经尝试在整形2包中使用dcast函数

    dcast(split2, TYPE~VALUE)
    

    然而,我最终得到了这个结果,我不知道如何正确赋值。要正确覆盖的变量:

    split2$TYPE 3 6 21 1 CI95(L) 4 0 0 2 CI95(U) 0 0 4 3 Ne 0 4 0

    我认为我对这个数据集的转换很愚蠢,我也尝试过对数据进行子集和重新组合,但我似乎也无法做到这一点。非常感谢您提供的任何帮助或一般方向的指点!!

    2 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    我们需要一个序列列。

    library(data.table)
    dcast(split2, rowid(TYPE)~TYPE) 
    
        2
  •  0
  •   Harrison    7 年前

    尝试一个整洁的解决方案。这假设您的 TYPE 值重复:

    library("tidyverse")
    
    df <- tribble(
      ~TYPE, ~VALUE,
      "Ne" ,     6,
      "CI95(L)", 3,
      "CI95(U)", 21,
      "Ne"   ,   6,
      "CI95(L)", 3,
      "CI95(U)" ,21,
      "Ne" ,     6,
      "CI95(L)" ,3,
      "CI95(U)", 21,
      "Ne"    ,  6,
      "CI95(L)", 3,
      "CI95(U)", 21
    )
    
    df %>% 
      dplyr::mutate(id = cumsum(TYPE=="Ne")) %>%
      tidyr::spread(TYPE,VALUE) %>% 
      dplyr::select(Ne, `CI95(L)`,`CI95(U)`)
    
    # A tibble: 4 x 3
    # Ne `CI95(L)` `CI95(U)`
    # * <dbl>     <dbl>     <dbl>
    # 1     6         3        21
    # 2     6         3        21
    # 3     6         3        21
    # 4     6         3        21