【发布时间】:2018-07-05 18:05:24
【问题描述】:
所以我正在尝试做一些如此简单的事情,以至于它竟然如此复杂让我感到惊讶。
给定一个简单的 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)]
以防万一有人偶然发现这个高度理论化的问题
【问题讨论】:
-
我建议你阅读 data.table 小插图。
-
那里没有答案
-
另请参见
?:=:DT[i, c("LHS1", "LHS2") := list(RHS1, RHS2), by = ...]或vignette on reference semantics 中Usage 中的第一个示例,例如“LHS 采用列名的字符向量,RHS 采用值列表。RHS 只需要是一个列表,不管它是如何生成的”。当然,我不能代表反对者发言,但我的猜测是,您问题中的所有咆哮都可能导致负面评价。您可以考虑进行编辑。干杯
标签: r indexing data.table