【问题标题】:Converting data to longitudinal data将数据转换为纵向数据
【发布时间】:2017-11-25 08:06:56
【问题描述】:

您好,我在尝试使用 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”、“垃圾类别”列,它告诉我们垃圾的类别,即 1-10 和“垃圾编号”,它告诉我们垃圾的数量每个垃圾分类:

   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

等等。

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

【问题讨论】:

    标签: r reshape reshape2 longitudinal


    【解决方案1】:

    你可以这样做:

    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
    

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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-02-14
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多