R data.table简单替换整行

时间:2018-07-05 18:05:25

标签: r indexing data.table

因此,我正在尝试做的事情如此简单,以至于令我惊讶的是结果竟是如此复杂。

给定一个简单的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)]

万一有人偶然发现这个高度理论性的问题

2 个答案:

答案 0 :(得分:0)

您的问题听起来像是有人抱怨很难将拖车挂在兰博基尼上。您的汽车经销商将告诉您购买卡车而不是赛车。

如果用原子向量替换行似乎对您来说是一项常规任务,那么矩阵似乎是适合您的数据结构。

如果要使用data.table,则应将数据整形为长格式,然后将引用语义与子集一起使用:

longDT[observationNo == 1, values := replacementVector]

答案 1 :(得分:0)

xx[1, (colnames(xx)):= list(1,2)]