This question already has answers here:
Combine Multiple Columns Into Tidy Data [duplicate]

(3个答案)


3年前关闭。





我有类似以下的数据,我想将其转换为长格式。

id count a1     b1 c1   a2     b2 c2  a3    b3  c3  age
1  1     apple  2  3    orange 3  2   beer   2   1   50
1  2     orange 3  2    apple  2  2   beer   2   1   50
2  1     pear   3  2    apple  2  2   orange 2   2   45


[a1,b1,c1],[a2,b2,c2],[a3,b3,c3]是具有指定ID的人所面临的三个属性的集合,该人可能会面临多项选择情况,计数表明第i个选择情况。我想将其改回长格式,同时保留其他变量,如下所示:

id count    a    b  c  age
1  1      apple  2  3  50
1  1      orange 3  2  50
1  1      beer   2  1  50
1  2      orange 3  2  50
1  2      apple  2  2  50
1  2      beer   2  1  50
2  1      pear   3  2  45
2  1      apple  2  2  45
2  1      orange 2  2  45


我尝试使用以下命令重塑形状,但是在处理timevar和时间方面我感到困惑:

 l <- reshape(df,
           varying = df[,3:11],
           v.names = c("a","b","c"),
           timevar = "choice",
           times = c("a","b","c"),
           direction = "long")


使用上述命令,我无法获得想要的结果,我们将不胜感激!

最佳答案

要使用reshape函数,只需调整可变参数即可。它可以是一个列表,您想将与向量组成同一列的变量放在列表中:

reshape(df,
        idvar=c("id", "count", "age"),
        varying = list(c(3,6,9), c(4,7,10), c(5,8,11)),
        timevar="time",
        v.names=c("a", "b", "c"),
        direction = "long")


这返回

         id count age time      a b c
1.1.50.1  1     1  50    1  apple 2 3
1.2.50.1  1     2  50    1 orange 3 2
2.1.45.1  2     1  45    1   pear 3 2
1.1.50.2  1     1  50    2 orange 3 2
1.2.50.2  1     2  50    2  apple 2 2
2.1.45.2  2     1  45    2  apple 2 2
1.1.50.3  1     1  50    3   beer 2 1
1.2.50.3  1     2  50    3   beer 2 1
2.1.45.3  2     1  45    3 orange 2 2


我还添加了idvars,因为我认为这通常对其他人或重新读取您的旧代码是一种很好的做法。

数据

df <- read.table(header=T, text="id count a1     b1 c1   a2     b2 c2  a3    b3  c3  age
1  1     apple  2  3    orange 3  2   beer   2   1   50
1  2     orange 3  2    apple  2  2   beer   2   1   50
2  1     pear   3  2    apple  2  2   orange 2   2   45")

关于r - R:将数据从宽转换为长-多种情况-出现错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38448412/

10-16 23:51