gpt4 book ai didi

r - 当数据量很大时,dcast 无法转换字符列

转载 作者:行者123 更新时间:2023-12-03 15:57:09 24 4
gpt4 key购买 nike

我正在使用 dcast library(reshape2) 中的函数封装以转换一个简单的三列表格

df = data.table(id  = 1:1e6, 
var = c('continent','subcontinent',...),
val = c('America','Caribbean',...)````

来自 dcast(df, id ~ var, value.var ='val')它会自动将值转换为计数,即
id     continent   subcontinent
1 1 1
2 1 1

但是,如果我将大小减少到 10000 行,它会正确输出
id     continent   subcontinent
1 America Caribbean
2 Europe West Europe

这是一个错误还是我需要以某种方式更改代码?请帮忙。谢谢!

最佳答案

问题不在于数据集本身的大小,而在于完整数据集中出现重复条目​​。通过从完整数据集中挑选较小的子集,有可能不包含重复项。help("dcast", "data.table")说:

When variable combinations in formula doesn't identify a unique value in a cell, fun.aggregate will have to be specified, which defaults to length if unspecified.


如何在完整数据集中查找重复项
所有出现的重复都可以通过
cols <- c("id", "var")
df[duplicated(df, by = cols) | duplicated(df, by = cols, fromLast = TRUE)][
order(id)]
   id          var           val
1: 1 subcontinent Caribbean
2: 1 subcontinent South America

请注意,我们正在 id 中查找重复项和 var因为这两个形成了 reshape 结果的单元格,即行和列。
为什么 unique()不起作用
注意:这就是为什么简单地取 unique(df) 的解释。不管用:
unique(df)
   id          var           val
1: 1 continent America
2: 1 subcontinent Caribbean
3: 2 continent Europe
4: 2 subcontinent West Europe
5: 1 subcontinent South America

不删除任何行。最后,
dcast(unique(df), id ~ var, value.var = "val")
Aggregate function missing, defaulting to 'length'
id continent subcontinent
1: 1 1 2
2: 2 1 1

然而
unique(df, by = cols)
   id          var         val
1: 1 continent America
2: 1 subcontinent Caribbean
3: 2 continent Europe
4: 2 subcontinent West Europe

已删除重复 varid == 1L .最后,
dcast(unique(df, by = cols), id ~ var, value.var = "val")
   id continent subcontinent
1: 1 America Caribbean
2: 2 Europe West Europe

如何找到重复行的行号
OP 报告说该问题仅出现在完整数据集上,而不出现在第一个 1e5 的子集上。行。
可以通过以下方式找到重复条目的行索引
which(duplicated(df, by = cols))
返回 5对于样本数据集。对于 OP 的完整数据集,我怀疑
min(which(duplicated(df, by = cols))) > 1e5
为真,即前 1e5 行内没有重复项。
即使在重复条目的情况下如何创建字符列
OP's own approach使用 fun.aggregate = function(x) paste(x[1L])以及申请 unique()df只是旨在消除任何令人不安的重复项。重复项将被悄悄删除。
或者, toString()可以用作显示重复条目的聚合函数:
dcast(df, id ~ var, toString, value.var = "val")
   id continent             subcontinent
1: 1 America Caribbean, South America
2: 2 Europe West Europe

数据
library(data.table)
df <- data.table(
id = c(1L, 1L, 2L, 2L, 1L),
var = c("continent", "subcontinent", "continent", "subcontinent", "subcontinent"),
val = c("America", "Caribbean", "Europe", "West Europe", "South America")
)

df
   id          var           val
1: 1 continent America
2: 1 subcontinent Caribbean
3: 2 continent Europe
4: 2 subcontinent West Europe
5: 1 subcontinent South America

关于r - 当数据量很大时,dcast 无法转换字符列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52355601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com