将数据转换为纵向数据

Converting data to longitudinal data

您好,我在尝试使用 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

等等。

非常感谢您的帮助谢谢!

您可以按如下方式进行:

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

如您所见,只有顺序与您请求的输出不同,但我相信您可以自己解决这个问题。 (如果没有,有很多关于如何做到这一点的资源)。

希望对您有所帮助!

要获得所需的输出,您必须 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)]