首页 > 解决方案 > 在 dcast() 参数“value.var”上

问题描述

因此,我上次在数据帧上使用了 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 被覆盖并且代码列用作 value.var 的警告,这没问题 2. 这次我获得输出的格式完全不同。

ID  FGV34  WER45
123 FGV34    NA
566 FGV34  WER45

我检查了 df1 和 df2 中属性的数据类型。对于 ID 和代码,它们是相同的。我需要帮助来获得像以前一样的输出,使用 0 或 1 而不是 NA 和列名。其次,我想了解 dcast() 的行为发生了哪些变化。

标签: rrstudioreshapereshape2dcast

解决方案


两者reshape2spread都已被弃用或退役 -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 包(v0.3.0)于 2019 年 10 月 16 日创建


推荐阅读