2

こんにちは、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

等々。

本当にありがとうございました!

4

2 に答える 2

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

ご覧のとおり、要求された出力と順序が異なるだけですが、それは自分で修正できると確信しています。(そうでない場合は、その方法に関するリソースがたくさんあります)。

お役に立てれば!

于 2017-11-25T08:42:14.047 に答える
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)]
于 2017-11-25T08:42:26.780 に答える