【问题标题】:How to collapse multiple columns of data into two columns, with one indicator column and one data column如何将多列数据折叠成两列,一列指标列一数据列
【发布时间】:2013-03-13 15:08:24
【问题描述】:

我在 3 个条件下进行了实验。数据目前是这样组织的:

| X | Y | Z |
|   | 1 |   |
|   | 0 |   |
| 0 |   |   |
| 0 |   |   |
|   |   | 1 |
|   |   | 1 |

我希望它看起来像这样:

| Y | 1 |
| Y | 0 |
| X | 0 |
| X | 0 |
| Z | 1 |
| Z | 1 |

这是因为似乎很多分析都需要这种格式。

我希望可能有一个函数可以进行这种转换,因为它似乎很常见。

编辑:

我尝试使用下面的重塑建议,但遇到了问题。它似乎没有影响结构。我的数据一定与构建的测试数据不同,但我不确定如何。

我在这方面遇到了一些麻烦,我想也许你可以帮忙。

> simpleGame
   Q6.4 Q7.4 Q8.4
3               2
5               2
8          1     
11              2
13         1     
14    2          
16              1
17         1     
19    2          
23    2          
24              1
26    2          
28    2    

但是当我运行 melt 时,它似乎并没有改变任何东西:

> na.omit(melt(simpleGame))
Using Q6.4, Q7.4, Q8.4 as id variables
   Q6.4 Q7.4 Q8.4
1               2
2               2
3          1     
4               2
5          1     
6     2          
7               1
8          1     
9     2          
10    2          
11              1
12    2          
13    2   

任何建议将不胜感激。

Edit2:根据要求,这里是数据框的 dput:

> dput(simpleGame)
structure(list(Q6.4 = structure(c(1L, 1L, 1L, 1L, 1L, 3L, 1L, 
1L, 3L, 3L, 1L, 3L, 3L), .Label = c("", "1", "2", "Which do you choose?"
), class = "factor"), Q7.4 = structure(c(1L, 1L, 2L, 1L, 2L, 
1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "1", "2", "Which do you choose?"
), class = "factor"), Q8.4 = structure(c(3L, 3L, 1L, 3L, 1L, 
1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L), .Label = c("", "1", "2", "Which do you choose?"
), class = "factor")), .Names = c("Q6.4", "Q7.4", "Q8.4"), row.names = c(3L, 
5L, 8L, 11L, 13L, 14L, 16L, 17L, 19L, 23L, 24L, 26L, 28L), class = "data.frame")

我在想也许这与这些实际上是因素有关?我不知道如何将整个 data.frame 强制转换为数字,但我想也许可以做到。

【问题讨论】:

    标签: r


    【解决方案1】:

    如果你的数据是这样的:

    df <- structure(list(X = c(NA, NA, 0, 0, NA, NA), Y = c(1, 0, NA, NA, 
          NA, NA), Z = c(NA, NA, NA, NA, 1, 1)), .Names = c("X", "Y", "Z"
          ), class = "data.frame", row.names = c(NA, -6L))
    

    试试这个:

    na.omit(stack(df))
    #    values ind
    # 3       0   X
    # 4       0   X
    # 7       1   Y
    # 8       0   Y
    # 17      1   Z
    # 18      1   Z
    

    如果您想要您的订单:

    na.omit(stack(df[c(2,1,3)]))[c(2,1)]
    #    ind values
    # 1    Y      1
    # 2    Y      0
    # 9    X      0
    # 10   X      0
    # 17   Z      1
    # 18   Z      1
    

    【讨论】:

      【解决方案2】:

      使用reshape2 和@Arun 数据结构:

      na.omit(melt(df))
      Using  as id variables
         variable value
      3         X     0
      4         X     0
      7         Y     1
      8         Y     0
      17        Z     1
      18        Z     1
      

      编辑使用 OP 结构

      dat.m <- melt(dat,measure.vars = c('Q6.4','Q7.4','Q8.4'))
      dat.m[!(dat.m$value == ''),]
      

      说明:您的所有列都是因子。 melt 的默认行为是将因子列作为 id。作为一种解决方法,我告诉melt 它们是可测量的变量,所以melt 将行名作为id。对于第二部分,我只是将na.omit 替换为!(dat.m$value == ''),因为我的值中没有 NA,我只有空字符。

      【讨论】:

      • (+1) 因为你使用了我创建的数据:P
      • 我在让它工作时遇到了一些麻烦。我做了一个编辑显示我做了什么。如果您看一看,我将不胜感激。谢谢!
      • @evt 你能输入dput(simpleGame) 并将他的结果添加到 OP 中吗?
      • 完成。我在想也许这与这些实际上是因素有关?我不知道如何将整个 data.frame 强制转换为数字,但我想也许可以做到。
      • 谢谢。这很好用。你介意向我解释一下是什么挂了?
      猜你喜欢
      • 2021-08-20
      • 2021-10-22
      • 2021-07-12
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2018-04-21
      • 2017-05-07
      相关资源
      最近更新 更多