R中data.table的dcast函数报错:名称属性与向量长度不匹配
data.table的dcast转换报错:属性长度不匹配
问题描述
我有一个data.table对象comb,执行以下dcast转换时出现错误:
comb_wide <- dcast(comb, scenarios + qName + hemName ~ PWC_cutoff, value.var = sum)
R返回错误信息:
Error in setattr(ans, "names", c(lhsnames, allcols)) : 'names' attribute [7] must be the same length as the vector [3]
无法理解错误中提及的属性长度[7]和向量长度[3]分别指代什么。
comb的结构信息:
> str(comb) Classes ‘data.table’ and 'data.frame': 96 obs. of 5 variables: $ scenarios : chr "historical_1991_2010" "ssp126_2041_2060" "ssp126_2081_2100" "ssp585_2041_2060" ... $ qName : chr "q1" "q1" "q1" "q1" ... $ hemName : Factor w/ 2 levels "NH","SH": 1 1 1 1 1 1 1 1 1 1 ... $ sum : num 0 0 0 0 0 ... $ PWC_cutoff: num 20 20 20 20 20 20 40 40 40 40 ... - attr(*, ".internal.selfref")=<externalptr>
comb的dput输出:
structure(list(scenarios = c("historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor", "historical_1991_2010", "ssp126_2041_2060", "ssp126_2081_2100", "ssp585_2041_2060", "ssp585_2081_2100", "aglabor"), qName = c("q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q1", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3", "q3"), hemName = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("NH", "SH"), class = "factor"), sum = c(0, 0, 0, 0, 0, 746051, 0, 0, 0, 0, 35, 746051, 0, 141, 341, 598, 25672, 746051, 50171, 72535, 75671, 82293, 200119, 746051, 0, 0, 0, 0, 0, 137649, 0, 0, 0, 0, 0, 137649, 0, 0, 0, 7, 26595, 137649, 39501, 54149, 54192, 62361, 92355, 137649, 0, 0, 0, 0, 0, 746051, 0, 0, 0, 0, 28991, 746051, 3909, 63236, 75858, 99751, 341094, 746051, 365996, 462080, 464957, 488522, 569331, 746051, 0, 0, 0, 0, 0, 137649, 0, 0, 0, 0, 0, 137649, 0, 1, 2, 110, 8023, 137649, 14720, 18365, 18447, 21514, 35848, 137649), PWC_cutoff = c(20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 60, 60, 60, 60, 60, 60, 80, 80, 80, 80, 80, 80, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 60, 60, 60, 60, 60, 60, 80, 80, 80, 80, 80, 80, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 60, 60, 60, 60, 60, 60, 80, 80, 80, 80, 80, 80, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 60, 60, 60, 60, 60, 60, 80, 80, 80, 80, 80, 80)), row.names = c(NA, -96L ), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x13783aee0>)
问题解答
错误原因分析
报错的核心是参数传递错误:value.var需要接收列名的字符串,但你直接写了sum——这是R的内置求和函数,不是你的数据列名。这导致dcast无法正确识别要聚合的列,进而在构造结果的列名时出现长度不匹配:
- 向量长度[3]:指你指定的分组列
scenarios + qName + hemName共3列,此时dcast错误生成的中间结果只有这3列数据; - 属性长度[7]:
dcast预期生成7列(3个分组列 + 4个PWC_cutoff的唯一值:20、40、60、80),尝试给3列数据赋予7个列名,两者长度不匹配,触发报错。
解决方案
将value.var = sum修改为value.var = "sum",明确指定要使用的列名:
comb_wide <- dcast(comb, scenarios + qName + hemName ~ PWC_cutoff, value.var = "sum")
执行后即可得到正确的宽表结构,列包含3个分组列和4个对应PWC_cutoff数值的聚合列。
内容的提问来源于stack exchange,提问作者JerryN
相关产品推荐
相关产品推荐

