【问题标题】:Rearrange dataframe using dcast using a dummy使用 dcast 使用假人重新排列数据帧
【发布时间】:2019-01-28 14:29:45
【问题描述】:

我喜欢使用 dcast 函数(reshape2 包)返回一个 reshape 数据框,但不起作用。在我的例子中:

#Data set
X<-c(804519.4,804519.6,804519.6,804519.4,804519.4,804519.4,804519.6,804519.6,804519.4,804519.4)
Y<-c(7673833,7673833,7673833,7673833,7673833,7673833,7673833,7673833,7673833,7673833)
band<-c("band1","band1","band1","band1","band1","band2","band2","band2","band2","band2")# My original data set are 31 bands
reflec<-c(9.608848,10.504454,8.648237,9.935091,11.282750,9.608848,10.504454,8.648237,9.935091,11.282750)
dummy<-1:10
RES3<-data.frame(X,Y,band,reflec,dummy)
RES3
          X       Y  band    reflec dummy
1  804519.4 7673833 band1  9.608848     1
2  804519.6 7673833 band1 10.504454     2
3  804519.6 7673833 band1  8.648237     3
4  804519.4 7673833 band1  9.935091     4
5  804519.4 7673833 band1 11.282750     5
6  804519.4 7673833 band2  9.608848     6
7  804519.6 7673833 band2 10.504454     7
8  804519.6 7673833 band2  8.648237     8
9  804519.4 7673833 band2  9.935091     9
10 804519.4 7673833 band2 11.282750    10
RES3<-as.data.frame(RES3)
colnames(RES3)<-c("X","Y","band","reflec","dummy")
dcast(RES3, X + Y + dummy ~ band,
         fun.aggregate = length,
         value.var="reflec")

不起作用,我的输出是:

          X       Y dummy band1 band2
1  804519.4 7673833     1     1     0
2  804519.4 7673833     4     1     0
3  804519.4 7673833     5     1     0
4  804519.4 7673833     6     0     1
5  804519.4 7673833     9     0     1
6  804519.4 7673833    10     0     1
7  804519.6 7673833     2     1     0
8  804519.6 7673833     3     1     0
9  804519.6 7673833     7     0     1
10 804519.6 7673833     8     0     1

我预计:

         X       Y    band1    band2      
1 804519.4 7673833    9.608848 9.608848    
2 804519.6 7673833   10.504454 10.504454   
3 804519.6 7673833    8.648237  8.648237   
4 804519.4 7673833    9.935091  9.935091   
5 804519.4 7673833   11.282750 11.282750   

任何成员都可以帮助我,因为我的原始数据集是 31 个波段作为级别,我想在列中转换?谢谢!

【问题讨论】:

  • reshape2 已被弃用,取而代之的是 tidyr 仅供参考:github.com/cran/reshape2
  • 另外,为什么as.data.framecolnames 的行?您已经有了一个包含这些列名的数据框

标签: r reshape reshape2


【解决方案1】:

就像我提到的,reshape2 一直是 deprecated 支持 tidyrtidyverse 包中。在我(以及包的作者)看来,tidyrspreadgatherreshape2castmelt 更清晰一点——没有公式符号,更简洁的方式指定值。 (一些上下文是here)。

正如我所提到的,您还有几行额外的行——data.frame 将根据进入其中的向量的名称添加列名。

我已更新此答案以匹配您发布的新数据。我的原始解决方案适用于您的原始数据,但需要更多步骤来处理您的新数据,我正在使用 dplyr 函数。

此时我还没有完全得到 dummy 列,因为它不在您的预期输出中。我用dplyr::select(-dummy) 放弃它。 tidyr::spread 的一个棘手问题是您需要某种方式来唯一地标记行——这很烦人,但也可以防止在重塑数据时出错。所以我按band分组,然后添加行号如下:

library(tidyr)
library(dplyr)

res3 <- data.frame(X, Y, band, reflec, dummy)

res3 %>%
  select(-dummy) %>%
  group_by(band) %>%
  mutate(row = row_number())
#> # A tibble: 10 x 5
#> # Groups:   band [2]
#>          X       Y band  reflec   row
#>      <dbl>   <dbl> <fct>  <dbl> <int>
#>  1 804519. 7673833 band1   9.61     1
#>  2 804520. 7673833 band1  10.5      2
#>  3 804520. 7673833 band1   8.65     3
#>  4 804519. 7673833 band1   9.94     4
#>  5 804519. 7673833 band1  11.3      5
#>  6 804519. 7673833 band2   9.61     1
#>  7 804520. 7673833 band2  10.5      2
#>  8 804520. 7673833 band2   8.65     3
#>  9 804519. 7673833 band2   9.94     4
#> 10 804519. 7673833 band2  11.3      5

这样,第 1 行将有一个波段 1 的值和一个波段 2 的值,依此类推。然后我调用spread,以带作为键成为列,并使用反射值填充这些列,最后删除行号列。

res3 %>%
  select(-dummy) %>%
  group_by(band) %>%
  mutate(row = row_number()) %>%
  spread(key = band, value = reflec) %>%
  select(-row)
#> # A tibble: 5 x 4
#>         X       Y band1 band2
#>     <dbl>   <dbl> <dbl> <dbl>
#> 1 804519. 7673833  9.61  9.61
#> 2 804519. 7673833  9.94  9.94
#> 3 804519. 7673833 11.3  11.3 
#> 4 804520. 7673833 10.5  10.5 
#> 5 804520. 7673833  8.65  8.65

reprex package (v0.2.1) 于 2019 年 1 月 28 日创建

【讨论】:

    【解决方案2】:

    value.var 应该是一个指定列名的字符串。根据?dcast

    value.var - 存储值的列的名称

    而列的name是字符串

    通过指定它不带引号,它正在从值中搜索列名

    dcast(RES3, X + Y + dummy ~ band,
             fun.aggregate = length,
             value.var="reflec")
    

    【讨论】:

      【解决方案3】:
      RES4<-dcast(RES3, ... ~ band,
                  value.var="reflec")
      

      【讨论】:

      • 嗨!最好留下一些评论来解释您的代码。考虑到其他人可能会来这里寻求解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多