【问题标题】:on dcast() argument "value.var"在 dcast() 参数“value.var”上
【发布时间】:2019-10-16 11:53:43
【问题描述】:

所以,我上次在数据帧上使用了 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() 的行为发生了哪些变化。

【问题讨论】:

  • tidrdplyr 解决方案可能会有所帮助。试试这个df %>% filter(!is.na(Codes)) %>% spread(Codes, ID)
  • 不,我认为它要求列没有任何重复值。但在我的情况下,ID 重复..
  • 你有你的数据框吗,我刚刚测试了一个重复,它可以工作。
  • 不走运。以下是我得到的错误。“错误:每行输出必须由唯一的键组合标识。键共享 61 行:”
  • 您可能在Codes 中重复。

标签: r rstudio reshape reshape2 dcast


【解决方案1】:

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 package (v0.3.0) 于 2019 年 10 月 16 日创建

【讨论】:

  • 这给了我想要的输出。谢谢你。那么,据我了解,在数据框中拥有唯一列并不是 dcast() 识别输入行的先决条件?
  • 您的数据框现在是unique(d2)。这种组合是独一无二的。我想。
  • 正确。 dcast 使用聚合函数(通常默认为长度) - 因此它可以将多个值减少到一个。当它是length 时,它实际上是在计算IDcodes 的每个组合。
  • @deepseefan, dcast 用于所有 3 个示例。您不需要唯一的行 - 它使用聚合函数(length 在上述所有 3 种情况下)。上一个示例中的 unique 调用只是将每个组合只计算一次。
猜你喜欢
  • 2014-09-28
  • 2021-11-16
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2014-05-28
  • 1970-01-01
相关资源
最近更新 更多