因此,我上次在一个数据帧上使用了dcast(),其中一列是ID,每个ID分配了其他多个代码。我的df1看起来像这样:
ID codes gfreq
123 FGV34 0.988
123 FGV34 0.988
123 FGV34 0.988
566 WER45 na
566 FGV34 0.988
566 FGV34 0.988
以便将上述格式转换为:
ID FGV34 WER45
123 1 0
566 1 1
dcast(df1, ID ~ codes)
它运行得很好。 现在,我有一个类似的数据框df2,它只有两个列,ID和代码。
ID codes
123 FGV34
123 FGV34
123 FGV34
566 WER45
566 FGV34
566 FGV34
当我将其运行到dcast中时: 1.我收到有关Value.var被覆盖的警告,并且将codes列用作value.var,这没关系 2.这次获取输出的格式完全不同。
ID FGV34 WER45
123 FGV34 NA
566 FGV34 WER45
我已经检查了df1和df2中属性的数据类型。 ID和代码都相同。 我需要帮助,以便像以前一样使用0或1代替NA和列名来获取输出。 其次,我想了解dcast()的行为有所不同。
答案 0 :(得分:1)
reshape2
和spread
均已弃用或淘汰-tidyverse
现在希望您使用pivot_wider
。我尚未掌握该语法的最新信息,但dcast
仍然可以按照您希望的方式使用data.table
。
library(data.table)
d1 <- data.table(ID = c(11,11,11,12,12,12),
codes = c('a', 'a', 'a', 'b', 'a', 'a'),
gfreq = c(.5,.5,.5,NA,.5,.5))
dcast(d1, ID ~ codes)
#> Using 'gfreq' as value column. Use 'value.var' to override
#> Aggregate function missing, defaulting to 'length'
#> ID a b
#> 1: 11 3 0
#> 2: 12 2 1
d2 <- data.table(ID = c(11,11,11,12,12,12),
codes = c('a', 'a', 'a', 'b', 'a', 'a'))
dcast(d2, ID ~ codes)
#> Using 'codes' as value column. Use 'value.var' to override
#> Aggregate function missing, defaulting to 'length'
#> ID a b
#> 1: 11 3 0
#> 2: 12 2 1
## If you only want 1's and 0's
dcast(unique(d2), ID ~ codes,
fun.aggregate = length)
#> Using 'codes' as value column. Use 'value.var' to override
#> ID a b
#> 1: 11 1 0
#> 2: 12 1 1
由reprex package(v0.3.0)于2019-10-16创建