You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用data.table复制数据行报错:Error: unexpected symbol,求解决

解决data.table复制行时的语法错误问题

首先先明确你的需求:把dataHAVE里每个student对应的行,按照count列的数值复制成多行,得到dataWANT那样的结果。你的示例数据是对的:

library(data.table)
dataHAVE=data.frame("student"=c(1,2,3), "score" = c(10,11,12), "count"=c(4,1,2))
dataWANT=data.frame("student"=c(1,1,1,1,2,3,3), "score"=c(10,10,10,10,11,12,12), "count"=c(4,4,4,4,1,2,2))

你用data.table实现的思路完全没问题,出错的原因就是个小语法失误:setDT(dataHAVE)后面没有加换行或者分号,导致R把后续的dataHAVE[...]当成了前一个函数调用的一部分,所以才会弹出Error: unexpected symbol的错误提示。

修正后的代码可以这样写:

library(data.table)
# 先把data.frame转成data.table,这里用换行隔开后续代码避免语法报错
setDT(dataHAVE)
# 按count数值复制行,如果你需要Indx列就保留后面的分组赋值,不需要可以直接去掉
dataWANT_result <- dataHAVE[rep(1:.N, count)][, Indx := 1:.N, by = student]

如果不需要额外的Indx列,简化成下面这样就足够:

setDT(dataHAVE)
dataWANT_result <- dataHAVE[rep(1:.N, count)]

运行后你可以检查一下,dataWANT_result和你想要的dataWANT完全一致:

> dataWANT_result
   student score count
1:       1    10     4
2:       1    10     4
3:       1    10     4
4:       1    10     4
5:       2    11     1
6:       3    12     2
7:       3    12     2

另外再补充一个更简洁的data.table写法,用.I直接获取行索引,效果是一样的:

setDT(dataHAVE)
dataWANT_result <- dataHAVE[rep(.I, count)]

内容的提问来源于stack exchange,提问作者bvowe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:34:05