关于dcast()参数";var";

关于dcast()参数";var";,r,rstudio,reshape,reshape2,dcast,R,Rstudio,Reshape,Reshape2,Dcast,因此,我上次在一个数据帧上使用了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 5

因此,我上次在一个数据帧上使用了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()的行为方式。

重塑2和
spread
都已被弃用或退役-现在
tidyverse
希望您更广泛地使用
pivot\u
。我还没有掌握该语法的最新信息,但是
dcast
仍然可以使用
data.table
实现您想要的功能

库(data.table)
d1使用“gfreq”作为值列。使用“value.var”覆盖
#>缺少聚合函数,默认为“长度”
#>身份证
#> 1: 11 3 0
#> 2: 12 2 1
d2使用“代码”作为值列。使用“value.var”覆盖
#>缺少聚合函数,默认为“长度”
#>身份证
#> 1: 11 3 0
#> 2: 12 2 1
##如果你只想要1和0
dcast(唯一(d2),ID代码,
fun.aggregate=长度)
#>使用“代码”作为值列。使用“value.var”覆盖
#>身份证
#> 1: 11 1 0
#> 2: 12 1 1

由(v0.3.0)于2019-10-16创建的A
tidr
dplyr
解决方案可能会有所帮助。试试这个
df%>%filter(!is.na(Codes))%%>%spread(Codes,ID)
No,我想它要求列不具有任何重复值。。但在我的情况下,ID重复..你有你的数据帧吗,我刚刚用重复测试了一下,它成功了。没有运气。下面是我得到的错误。。“错误:每行输出必须由唯一的键组合标识。键共享61行:”可能您在
代码中重复了
。这给了我想要的输出。非常感谢。因此,据我所知,dcast()识别输入行的先决条件不是在数据帧中具有唯一列?您的数据帧现在是
unique(d2)
。这种组合是独一无二的。我想是的
dcast
使用聚合函数(通常默认为length)——因此它可以将多个值减少为一个值。当它是
length
时,它基本上是对
ID
code
的每个组合进行计数@deepseefan,
dcast
用于所有3个示例中。它不需要唯一的行-它使用聚合函数(
length
在上述所有3种情况下)。上一个示例中的
unique
调用只对每个组合精确计数一次。