【问题标题】:How do I turn the rows of my data.frame into columns?如何将我的 data.frame 的行变成列?
【发布时间】:2014-07-28 09:22:15
【问题描述】:

我有一系列特定于变量的 data.frame,如下所示:

变量 1:

LOCATION 2014.01  2014.02  2014.03  2014.04
902010   7        -3       14       5

变量 2:

LOCATION 2014.01  2014.02  2014.03  2014.04
902010   9        11       6        3

我想转换 transform 并将它们组合成以下格式。

LOCATION    DATE     VARIABLE1  VARIABLE2
902010      2014.01  7          9
902010      2014.02  -3         11
902010      2014.03  14         6
902010      2014.04  5          3

我认为正确的方法是转换一个 data.frame,然后添加日期和位置匹配的其他数据。

类似问题的答案推荐使用库 reshape2 或函数 t(),但我很难理解如何在这种情况下使用它们。我还看到了有关时间序列库动物园的建议。

【问题讨论】:

    标签: r


    【解决方案1】:

    你应该:

    1. 使用melt 以长格式重塑您的数据
    2. 使用merge按(位置和日期)组合data.frames

    这里有一个完整的解决方案: 库(reshape2)

    dat1 <- 'LOCATION 2014.01  2014.02  2014.03  2014.04
    902010   7        -3       14       5'
    
    dat2 <- 'LOCATION 2014.01  2014.02  2014.03  2014.04
    902010   9        11       6        3'
    
    ll <- lapply(list(dat1,dat2),function(x){
    dat <- read.table(text=x,header=TRUE)
    melt(dat,id.vars ='LOCATION')
    })
    
    res <- merge(ll[[1]],ll[[2]],by=1:2)
    
    # LOCATION variable value.x value.y
    # 1   902010 X2014.01       7       9
    # 2   902010 X2014.02      -3      11
    # 3   902010 X2014.03      14       6
    # 4   902010 X2014.04       5       3
    

    一个额外的步骤是强制你变量列到一个有效的日期。

    res$variable <- 
    as.Date(paste0(sub('X','',res$variable),'.01'),
            format='%Y.%m.%d')
    

    【讨论】:

      【解决方案2】:

      1) 定义一个merge 函数merge12,它由前两个变量合并和一个melt 函数melt1,它使用第一个变量作为id。然后定义L,一个数据框列表,像这样运行Reduce

      library(reshape2)
      
      merge12 <- function(..., by = 1:2) merge(..., by = by)
      melt1 <- function(..., id = 1) melt(..., id = id)
      
      L <- list(DF1, DF2)
      Reduce(merge12, lapply(L, melt1))
      

      对于问题中的数据框,这给出了以下内容

        LOCATION variable value.x value.y
      1   902010  2014.01       7       9
      2   902010  2014.02      -3      11
      3   902010  2014.03      14       6
      4   902010  2014.04       5       3
      

      注意:这也适用于两个以上的数据帧。只需将它们全部放入列表L

      2) fn$ 在 gsubfn 中使用 fn$,它允许函数参数表示为公式,我们可以以更紧凑的方式编写上述内容:

      library(reshape2)
      library(gsubfn)
      
      L <- list(DF1, DF2)
      fn$Reduce(~ merge(..., by = 1:2), fn$lapply(L, ~ melt(..., id = 1)))
      

      给出相同的结果。

      添加 (2)

      【讨论】:

        【解决方案3】:

        你试过merge()函数吗?

        您可能还会发现它很有用! Merge or combine by rownames

        【讨论】:

          【解决方案4】:

          这是使用基本 R 函数实现目标的一种方法。

          > cb <- cbind(var1[1], names(var1)[-1], sapply(list(var1[-1], var2[-1]), t))
          > names(cb)[2:4] <- c("DATE", "VAR1", "VAR2") 
          > cb
          #   LOCATION     DATE VAR1 VAR2
          # 1   902010 X2014.01    7    9
          # 2   902010 X2014.02   -3   11
          # 3   902010 X2014.03   14    6
          # 4   902010 X2014.04    5    3
          

          如果您不介意列的顺序不同,可以将其缩短为三列,

          > rb <- rbind(var1 = var1, var2 = var2)
          > cbind(t(rb[-1]), LOC = var1$LOCATION)
          #          var1 var2    LOC
          # X2014.01    7    9 902010
          # X2014.02   -3   11 902010
          # X2014.03   14    6 902010
          # X2014.04    5    3 902010
          

          【讨论】:

            猜你喜欢
            • 2012-09-20
            • 1970-01-01
            • 1970-01-01
            • 2011-12-03
            • 1970-01-01
            • 2012-11-15
            • 1970-01-01
            • 1970-01-01
            • 2011-01-20
            相关资源
            最近更新 更多