我想使用dcast函数(reshape2包)返回一个重塑数据帧,但是不起作用。在我的示例中:
#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个波段,并且我想按列进行转换?谢谢!
答案 0 :(得分:3)
就像我提到的,reshape2
在tidyr
软件包中被deprecated赞成tidyverse
。我认为(以及软件包作者的观点),tidyr
的{{1}}和spread
比gather
的{{1}}更清晰, reshape2
-没有公式符号,更简洁的方法来指定值。 (为此,某些上下文是here)。
也正如我提到的,您还有几行额外的内容-cast
将根据进入其中的向量的名称添加列名称。
我已经更新了此答案以匹配您发布的新数据。我的原始解决方案适用于您的原始数据,但是需要使用melt
函数来处理新数据的更多步骤。
由于您的预期输出中未包含data.frame
列,因此我目前尚未完全了解。我用dplyr
删除了它。 dummy
的一处棘手的事情是,您需要某种方式来唯一地标记行—烦人,但也可以防止在重塑数据时出错。因此,我按dplyr::select(-dummy)
进行分组,然后按如下所示添加行号:
tidyr::spread
这样,第1行将具有band 1值和band 2值,依此类推。然后我调用band
,将带区作为键,以使其成为列,并使用reflec值填充这些列,最后删除行号列。
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
由reprex package(v0.2.1)于2019-01-28创建
答案 1 :(得分:2)
value.var
应该是用于指定列名称的字符串。根据{{1}}
value.var-存储值的列名
列的?dcast
是字符串
通过指定未加引号的方式,它正在从值中搜索列名称
name
答案 2 :(得分:0)
RES4<-dcast(RES3, ... ~ band,
value.var="reflec")