使用五个不同的度量列

时间:2017-04-13 10:21:07

标签: r for-loop dplyr reshape2

为第一篇不起眼的帖子道歉,这是我第一次去这里。我修改了它,我希望现在更容易理解。

我一直在尝试将多个大型数据集从长格式转换为宽格式,然后使用公共标识符将它们合并在一起。

数据是渔业数据。目前,我需要将目标捕获数据从long转换为宽,并附加到已格式化为每行作为单个“TripSet”值的数据集,该值是整个数据集中的公共标识符。

我需要将数据集从long转换为wide的格式如下:

my.df <- data.frame(Trip=rep(c("A","B","C"), 5), Set=rep(1:5, each=3), CommonName=rep
(c("i","j","k"),5),TotCat=1:15, Kept=16:30, RtnAlive=31:45, RtnDead= 46:60, RtnUnk= 61:75)

my.df$TripSet <- paste(my.df$Trip,my.df$Set)

my.df
   Trip Set CommonName TotCat Kept RtnAlive RtnDead RtnUnk TripSet
1     A   1          i      1   16       31      46     61     A 1
2     B   1          j      2   17       32      47     62     B 1
3     C   1          k      3   18       33      48     63     C 1
4     A   2          i      4   19       34      49     64     A 2
5     B   2          j      5   20       35      50     65     B 2
6     C   2          k      6   21       36      51     66     C 2
7     A   3          i      7   22       37      52     67     A 3
8     B   3          j      8   23       38      53     68     B 3
9     C   3          k      9   24       39      54     69     C 3
10    A   4          i     10   25       40      55     70     A 4
11    B   4          j     11   26       41      56     71     B 4
12    C   4          k     12   27       42      57     72     C 4
13    A   5          i     13   28       43      58     73     A 5
14    B   5          j     14   29       44      59     74     B 5
15    C   5          k     15   30       45      60     75     C 5

我可以使用cast或dcast从一个变量转换为long到wide,如下所示:

cast(my.df, TripSet ~ CommonName, value="TotCat")

   TripSet  i  j  k
1      A 1  1 NA NA
2      A 2  4 NA NA
3      A 3  7 NA NA
4      A 4 10 NA NA
5      A 5 13 NA NA
6      B 1 NA  2 NA
7      B 2 NA  5 NA
8      B 3 NA  8 NA
9      B 4 NA 11 NA
10     B 5 NA 14 NA
11     C 1 NA NA  3
12     C 2 NA NA  6
13     C 3 NA NA  9
14     C 4 NA NA 12
15     C 5 NA NA 15

但是我不确定我是否应该在这里获得如此多的NA值而不是零值。

我想要的数据格式是具有公共标识符'TripSet by row然后列中的每个物种按Common Name匹配'TotCat','Kept','RtnAlive','RtnDead','RtnUnk'。

我尝试融化然后重新编制数据如下:

dcast(melt(my.df, id.vars=c("TripSet", "CommonName")), TripSet~variable+CommonName)

   TripSet Trip_i Trip_j Trip_k Set_i Set_j Set_k TotCat_i TotCat_j TotCat_k Kept_i Kept_j Kept_k RtnAlive_i RtnAlive_j RtnAlive_k RtnDead_i
1      A 1      A   <NA>   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
2      A 2      A   <NA>   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
3      A 3      A   <NA>   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
4      A 4      A   <NA>   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
5      A 5      A   <NA>   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
6      B 1   <NA>      B   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
7      B 2   <NA>      B   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
8      B 3   <NA>      B   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
9      B 4   <NA>      B   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
10     B 5   <NA>      B   <NA>  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
11     C 1   <NA>   <NA>      C  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
12     C 2   <NA>   <NA>      C  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
13     C 3   <NA>   <NA>      C  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
14     C 4   <NA>   <NA>      C  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>
15     C 5   <NA>   <NA>      C  <NA>  <NA>  <NA>     <NA>     <NA>     <NA>   <NA>   <NA>   <NA>       <NA>       <NA>       <NA>      <NA>

这基本上是我的预期输出,但我不希望投射'Trip'和'Set'(以及我在实际数据集中的其他几个列变量),而只是采取'Kept','RtnAlive',' RtnDead','RtnUnk'作为附加度量变量,并且列名反映了所选的度量变量名和CommonName。

顺便说一下,由于没有数据,是否会生成NA值,因此,例如,在x个集合中没有保留通用名称或rtndead?

任何有关此的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

library(dplyr)
library(reshape2)
my.df %>% 
  melt(id.vars = c("Trip", "Set", "CommonName")) %>%      # make tall
  dcast(Trip + Set ~ variable + CommonName)                # make wide  

#    Trip Set TotCat_i TotCat_j TotCat_k Kept_i Kept_j Kept_k RtnAlive_i RtnAlive_j RtnAlive_k RtnDead_i
# 1     A   1        1       NA       NA     16     NA     NA         31         NA         NA        46
# 2     A   2        4       NA       NA     19     NA     NA         34         NA         NA        49
# 3     A   3        7       NA       NA     22     NA     NA         37         NA         NA        52
# 4     A   4       10       NA       NA     25     NA     NA         40         NA         NA        55
# 5     A   5       13       NA       NA     28     NA     NA         43         NA         NA        58
# 6     B   1       NA        2       NA     NA     17     NA         NA         32         NA        NA
# 7     B   2       NA        5       NA     NA     20     NA         NA         35         NA        NA
# 8     B   3       NA        8       NA     NA     23     NA         NA         38         NA        NA
# 9     B   4       NA       11       NA     NA     26     NA         NA         41         NA        NA
# 10    B   5       NA       14       NA     NA     29     NA         NA         44         NA        NA
# 11    C   1       NA       NA        3     NA     NA     18         NA         NA         33        NA
# 12    C   2       NA       NA        6     NA     NA     21         NA         NA         36        NA
# 13    C   3       NA       NA        9     NA     NA     24         NA         NA         39        NA
# 14    C   4       NA       NA       12     NA     NA     27         NA         NA         42        NA
# 15    C   5       NA       NA       15     NA     NA     30         NA         NA         45        NA