【问题标题】:R - how to add cases of one variable to other variable (stack variables)R - 如何将一个变量的情况添加到另一个变量(堆栈变量)
【发布时间】:2011-07-25 19:57:58
【问题描述】:
var1 var2 var3
   1    2    3
   1    2    3
   1    2    3

我想在 var1 下堆叠 var2 和 var3 得到:

var1
   1
   1
   1
   2
   2
   2
   3
   3
   3

我试过了:

data$var <- append(data$var1,data$var2)

然后我得到一个错误,我的替换有更多行。我该如何解决?

【问题讨论】:

    标签: r stack rbind


    【解决方案1】:
    df <- data.frame(var1=1:3,var2=4:6,var3=7:9)
    df2 <- stack(df)
    print(df2)
    
      values  ind
    1      1 var1
    2      2 var1
    3      3 var1
    4      4 var2
    5      5 var2
    6      6 var2
    7      7 var3
    8      8 var3
    9      9 var3
    

    【讨论】:

      【解决方案2】:

      你不妨试试unlist:

      dtf <- data.frame(a = 1:3, b = 1:3, c = 1:3)
      unlist(dtf)
      a1 a2 a3 b1 b2 b3 c1 c2 c3 
       1  2  3  1  2  3  1  2  3 
      

      【讨论】:

        【解决方案3】:

        您的输出与输入的行数不同,因此尝试将后者转换为前者会导致问题。只需制作一个新的数据框:

        df <- data.frame(x = c(df$var1, df$var2, df$var3)
        

        您还可以使用do.call,利用数据框实际上是一个列表这一事实:

        df <- data.frame(x = do.call("c", df))
        

        【讨论】:

          【解决方案4】:

          我猜您会收到此错误,因为数据框中的每个列/变量都需要具有相同的长度。您可以创建一个更长的新变量并将其与旧数据框连接,但它会重复其他变量中的数据。

          > df <- data.frame(var1=1:3,var2=4:6,var3=7:9)
          > df
            var1 var2 var3
          1    1    4    7
          2    2    5    8
          3    3    6    9
          
          # join combination of var1/var2 and 'df' dataframe
          
          > data.frame(newvar=c(df$var1,df$var2),df)
            newvar var1 var2 var3
          1      1    1    4    7
          2      2    2    5    8
          3      3    3    6    9
          4      4    1    4    7
          5      5    2    5    8
          6      6    3    6    9
          

          【讨论】:

          • 如果我这样做,我会得到: data.frame 中的错误(j_boa = c(data$dv_job_8_1, data$dv_job_8_2), df) :参数意味着不同的行数:6、3
          • @user670186 上面的例子有效,所以我认为你的代码可能有问题。也许 c(data$dv_job_8_1, data$dv_job_8_2), df) 需要是 c(data$dv_job_8_1, data$dv_job_8_2), data) 所以你引用了正确的原始数据帧。
          【解决方案5】:

          堆栈在这里似乎是显而易见的答案,但 reshape 包中的melt 确实以等效的方式工作,并且可能为其他更复杂的情况提供一些灵活性。假设您正在使用一个名为 dat 的对象:

          library(reshape)
          melt(dat)
          
            variable value
          1     var1     1
          2     var1     1
          3     var1     1
          4     var2     2
          5     var2     2
          6     var2     2
          7     var3     3
          8     var3     3
          9     var3     3
          

          如果您需要将其中一列保留为 ID 变量:

          > melt(dat, id.vars = "var1")
            var1 variable value
          1    1     var2     2
          2    1     var2     2
          3    1     var2     2
          4    1     var3     3
          5    1     var3     3
          6    1     var3     3
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-12-24
            • 1970-01-01
            • 1970-01-01
            • 2011-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多