因此,我正在尝试做的事情如此简单,以至于令我惊讶的是结果竟是如此复杂。
给定一个简单的data.table,我只想用长度等于data.table中列数的向量替换其第一行。
很简单,对吧?不完全的。进入一个令人费解的data.table索引世界。
x = data.table(stupidColumnA=22, stupidColumnB=33)
x[1, ] = c(100, 200)
为什么在世界上会出现这种可在每种编程语言中使用的直观语法呢?
Warning messages:
1: In `[<-.data.table`(`*tmp*`, 1, , value = c(100, 200)) :
Supplied 2 items to be assigned to 1 items of column 'stupidColumnA' (1 unused)
2: In `[<-.data.table`(`*tmp*`, 1, , value = c(100, 200)) :
Supplied 2 items to be assigned to 1 items of column 'stupidColumnB' (1 unused)
超出了我。更让人费解的是,在线搜索大约15分钟是完全没有结果的。
不用说,完成一项基本任务要比单行代码复杂得多,这在我看来只是不好的设计,因此我为此放弃了data.table。仅仅因为一个丑陋的转换到data.frame就可以了。
> xx = as.data.frame(x)
> xx[1, ] = c(100, 200)
> xx
stupidColumnA stupidColumnB
1 100 200
但是我很好奇。仅限data.table的解决方案是什么样的?
编辑(解决方案):
出于某种原因,该问题被认为是不值得的,不切实际的(即在实践中永远不会发生),因此被否决了。无论如何,解决方案是:
xx[1, (colnames(xx)):= list(1,2)]
万一有人偶然发现这个高度理论性的问题
答案 0 :(得分:0)
您的问题听起来像是有人抱怨很难将拖车挂在兰博基尼上。您的汽车经销商将告诉您购买卡车而不是赛车。
如果用原子向量替换行似乎对您来说是一项常规任务,那么矩阵似乎是适合您的数据结构。
如果要使用data.table,则应将数据整形为长格式,然后将引用语义与子集一起使用:
longDT[observationNo == 1, values := replacementVector]
答案 1 :(得分:0)
xx[1, (colnames(xx)):= list(1,2)]