【问题标题】:R data.table simple replacing of a whole row [duplicate]R data.table简单替换整行[重复]
【发布时间】: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 semanticsUsage 中的第一个示例,例如“LHS 采用列名的字符向量,RHS 采用值列表。RHS 只需要是一个列表,不管它是如何生成的”。当然,我不能代表反对者发言,但我的猜测是,您问题中的所有咆哮都可能导致负面评价。您可以考虑进行编辑。干杯

标签: r indexing data.table


【解决方案1】:
xx[1, (colnames(xx)):= list(1,2)]

【讨论】:

    【解决方案2】:

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

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

    如果您想使用 data.table,您只需将数据重塑为长格式,然后将引用语义与子集一起使用:

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

    【讨论】:

    • 一个更恰当的汽车类比恕我直言,我在抱怨我的超级豪华的 25 世纪未来派汽车没有油门踏板。我:“这辆车没有油门踏板。可笑” 经销商:“但它可以飞越时间和宇宙。”我:“是的……油门”
    • 我是 data.table 的重度用户。我从来不需要用原子向量替换一行。对我来说,这表明你要么不应该使用 data.table 或 data.frame,而是使用矩阵,要么你的数据不整洁(参见 Hadley Wickham 的publication 中的定义),你应该重塑你的数据。
    • 请注意,data.table 的列可以包含不同的数据类型,您不能在向量中组合这些数据类型。尝试使用替换列表的方法。它应该可以工作,但您仍应按照我的回答所示使用引用分配。
    • 另外,如果你不想飞,为什么还要使用data.table?类比可能是在飞机上要求油门踏板。
    • 我也是 data.table 的重度用户,即使具有扎实的计算机科学背景,data.table 索引的世界对我来说似乎总是无限的。这个用例是一个基本且频繁的更新操作,如果您对行使用条件索引,它实际上可以工作。它与 data.frame 无缝协作的事实不言而喻。无论如何,我希望有一个单线(除了标准的“改变你的方法”响应之外,幸运的是:xx[1, (colnames(xx)):= list(1,2)]
    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多