R 如何将多列数据折叠为两列,一列为指标列,一列为数据列

R 如何将多列数据折叠为两列,一列为指标列,一列为数据列,r,R,我用3种条件做了一个实验。数据当前的组织方式如下: | X | Y | Z | | | 1 | | | | 0 | | | 0 | | | | 0 | | | | | | 1 | | | | 1 | | Y | 1 | | Y | 0 | | X | 0 | | X | 0 | | Z | 1 | | Z | 1 | 我希望它看起来像这样: | X | Y | Z | | | 1 | | | | 0 | | | 0 | |

我用3种条件做了一个实验。数据当前的组织方式如下:

| X | Y | Z |
|   | 1 |   |
|   | 0 |   |
| 0 |   |   |
| 0 |   |   |
|   |   | 1 |
|   |   | 1 |
| Y | 1 |
| Y | 0 |
| X | 0 |
| X | 0 |
| Z | 1 |
| Z | 1 |
我希望它看起来像这样:

| 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强制转换为数字,但我想也许这样就可以了。

如果您的数据如下所示:

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[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
如果您的数据如下所示:

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[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
使用REGRAPE2和@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的默认行为是将factors列作为id。作为一种解决方法,我告诉melt它们是可测量的变量,因此melt将行名称作为id。对于第二部分,我只将na.omit替换为!dat.m$value==因为我的值中没有NA,所以我只有空字符。

使用整形2和@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的默认行为是将factors列作为id。作为一种解决方法,我告诉melt它们是可测量的变量,因此melt将行名称作为id。对于第二部分,我只将na.omit替换为!dat.m$value==因为我的值中没有NA,所以我只有空字符。

+1因为您使用了我创建的数据:PI在工作时遇到了一些问题。我做了一个编辑,展示了我所做的。如果你看一看,我将非常感激。谢谢大家!@evt您能否键入dputsimpleGame并将结果添加到OP?完成。我在想,也许这与事实有关,这些实际上是因素?我不知道如何将整个data.frame强制转换为数字,但我想也许可以。谢谢。这很有效。你介意向我解释一下挂断它的原因吗?+1因为你使用了我创建的数据:PI在工作中遇到了一些麻烦。我做了一个编辑,展示了我所做的。如果你看一看,我将非常感激。谢谢大家!@evt您能否键入dputsimpleGame并将结果添加到OP?完成。我在想,也许这与事实有关,这些实际上是因素?我不知道如何将整个data.frame强制转换为数字,但我想也许可以。谢谢。这很有效。你能给我解释一下挂起来的是什么吗?