将数据转换为纵向数据

时间:2017-11-25 08:06:57

标签: r reshape reshape2 longitudinal

您好我在尝试使用Reshape包将数据转换为纵向数据时遇到困难。如果有人能帮助我,将不胜感激,谢谢!

数据如下:

m <- matrix(sample(c(0, 0:), 100, replace = TRUE), 10)
ID<-c(1:10)
dim(ID)=c(10,1)
m<- cbind(ID,m)
d <- as.data.frame(m)
names(d)<-c('ID', 'litter1', 'litter2', 'litter3', 'litter4', 'litter5', 'litter6', 'litter7', 'litter8', 'litter9', 'litter10')
print(d)
   ID litter1 litter2 litter3 litter4 litter5 litter6 litter7 litter8 litter9 litter10
   1     0       0       0       3       1       0       2       0       0        3
   2     0       2       1       2       0       0       0       2       0        0
   3     1       0       1       2       0       3       3       3       2        0
   4     2       1       2       3       0       2       3       3       1        0
   5     0       1       2       0       0       0       3       3       1        0
   6     2       1       2       0       3       3       0       0       0        0
   7     0       1       0       3       0       0       1       2       2        0
   8     0       1       3       3       2       1       3       2       3        0
   9     0       2       0       2       2       3       2       0       0        3
   10    2       2       2       2       1       3       0       3       0        0

我希望将上述数据转换成纵向数据,其中列'ID','litter category'告诉我们垃圾的类别,即1-10和'litter number'告诉我们的件数每个垃圾类别:

   ID  littercategory litternumber

  1      4          3
  1      5          1
  1      7          2
  1      10         3
  2      2          2
  2      3          1
  2      4          2
  2      8          2

等等。

非常感谢您的帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

你可以这样做:

library(reshape2)
d = melt(d, id.vars=c("ID"))
colnames(d) = c('ID','littercategory','litternumber')
# remove the text in the littercategory column, keep only the number.
d$littercategory = gsub('litter','',d$littercategory)
d = d[d$litternumber!=0]

输出:

 ID littercategory litternumber
  1              1            4
  2              1            8
  3              1            6
  4              1            4
  7              1            6
  8              1            5
 10              1           10
  1              2            6
  2              2            9

正如您所看到的,只有订单与您请求的输出不同,但我相信您可以自行修复。 (如果没有,那么有很多资源可以解决这个问题。)

希望这有帮助!

答案 1 :(得分:0)

要获得所需的输出,您必须melt数据,并过滤掉大于0的值。

library(data.table)
result <- setDT(melt(d, "ID"))[value != 0][order(ID)]

# To get exact structure modify result
result[, .(ID, 
           littercategory = sub("litter", "", variable), 
           litternumber = value)]