关于dcast()参数";var";
因此,我上次在一个数据帧上使用了dcast(),其中一列是ID,另一列是每个ID分配的多个代码。我的df1如下所示:关于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
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
调用只对每个组合精确计数一次。