【问题标题】:How do I create a new column in a data.table with a regular sequence of string values?如何使用常规字符串值序列在 data.table 中创建新列?
【发布时间】:2020-06-10 09:56:39
【问题描述】:

我之前使用 $

my_data$component <- as.factor(c((rep("Con",1)),(rep("Neu",1)),(rep("Inc",1))))

自从我回到我的脚本进行更改(几个月后)因为我在分析中发现一个错误,这段代码 sn-p 不再有效,我得到了以下错误的回报:

Supplied 3 items to be assigned to 216 items of column 'c'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

我知道解决方案可能围绕 data.table 中的 := 函数展开,但我不是 R 向导(这些脚本是作为第一次涉足 R 编写的,试图放弃 SPSS 和 Excel 作为心理学家) .我不明白如何在 RHS 上使用 rep() 来实现相同的结果。

我想要的只是“con”、“neu”和“inc”在新列中定期复制我的 data.table 的长度。我在 data.table 包 pdf 中读到 RHS 是“替换值列表。它以通常的方式回收以填充满足 i 的行数,如果有的话。”。

我知道以通常的方式回收意味着回收一直持续到矩阵结束。

这是我尝试过的方法,它也给出了同样的错误。

dt <- data.table(A=(1:9))
dt
   A
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9

dt[ , 'c' := .("con","neu","inc")]

我会很感激任何帮助,因为我在试图解决这个看似简单的问题上花费的时间越长,以前在 data.table 所谓的功能下使用不太理想的代码工作,我就越觉得愚蠢。

【问题讨论】:

  • 也许:dt[ , c := rep(c("con","neu","inc"), 3)] ?

标签: r data.table


【解决方案1】:

要完成您当前的任务,您可以执行以下操作:

library(data.table)
dt <- data.table(A = 1:9)
dt[ , c := rep_len(c("con","neu","inc"), .N)]
dt
   A   c
1: 1 con
2: 2 neu
3: 3 inc
4: 4 con
5: 5 neu
6: 6 inc
7: 7 con
8: 8 neu
9: 9 inc

请注意,这是data.table 的一项相对较新的功能(自 2019 年 4 月 7 日起)。 The official explanation:

:= 不再回收长度>1 RHS 向量。有 回收时发出警告,但在 LHS 时没有警告 长度是 RHS 长度的精确倍数(与 基数 R)。几年来一致的反馈是回收 更多时候是一个错误。在极少数情况下,您需要回收 长度>1 向量,请明确使用rep()。单身的 值仍然像以前一样被静默回收 [...]

【讨论】:

  • 非常感谢。这也是@zx8754 评论的。我很接近......如果我不知道我会回收这些物品 3 次,因为例如我不知道我有 9 行(或者在我的真实数据集中确实有 216 行),我将如何设置x?
  • 例如,我只使用了cc&lt;-nrow(dt),然后使用了dt[ , c := rep(c("con","neu","inc"), cc/3)],但我觉得可能有更优雅的方式来做到这一点?
  • @Ben 这个解决方案应该适用于任意数量的行。 .N 在这种情况下与 nrow(dt) 相同。
猜你喜欢
  • 2016-07-06
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
相关资源
最近更新 更多