【问题标题】:Add a specified number of blank rows to a data table without overwriting the heading将指定数量的空白行添加到数据表而不覆盖标题
【发布时间】:2019-01-28 16:50:25
【问题描述】:

我正在尝试制作一个带有标题行的大型空白 data.table,以便在设置后在特定位置添加值。我已经能够复制第一行,然后清除every other row 或每一行,但我想做的是清除标题行之后的每一行。有些列是数字输入,有些是字符输入。

[input3]:

headers: header1 header2 header3..... header 60+

Values:   NA      NA       NA   ...     NA

重复行:

input3 <- input2[rep(1:nrow(input2), each = 2), ]

清除每一行:

input3[1:nrow(input3) %% 1 == 0, ] <- NA

但是,如果我尝试将其重写为从第 2 行开始复制空白行(以保留标题),我会收到此错误:

input3[2:nrow(input3) %% 1 == 0, ] <- NA

[.data.table(x, i, which = TRUE) 中的错误:i 计算为逻辑向量长度 9,但有 10 行。不再允许回收逻辑 i,因为它隐藏了比值得更多的错误难得的方便。如果您确实需要回收,请显式使用 rep(...,length=.N)。"

我需要能够在保留标题的同时动态添加行,因为这将是一个巨大的表,我将导出到另一个程序。

编辑:这与this 链接不同,因为我添加了数据中最初未指定的其他行。不只是擦除行。

【问题讨论】:

  • 改为使用input3[c(FALSE,2:nrow(input3) %% 1 == 0),] &lt;- NA。通过使用2:nrow,您明确给出的参数太少。当那个 thing 是一个逻辑向量时,它必须是长度为 1 或与行数相同。期间。
  • 我认为我们缺少括号
  • 好的,我让它与 input3[c(FALSE,2:nrow(input3) %% 1 == 0),]
  • 警告:当我说 “它必须是” 时,我的意思是不这样做(并且依赖于回收)很容易出现问题。最糟糕的情况是,当您的意图与预期不同时,它会默默地成功。

标签: r header duplicates data.table row


【解决方案1】:

改为使用

input3[c(FALSE,2:nrow(input3) %% 1 == 0,] <- NA

通过使用2:nrow,您明确给出了一个缩短的向量。当那个事物是一个逻辑向量时,它必须是长度为1或与行数相同。期间。

虽然这有它的问题并且我不鼓励使用它,但也许您期望它的行为如下:

input3[which(2:nrow(input3) %% 1 == 0),] <- NA

这样做的“好处”是which(...) 返回一个integer 的向量,因此它不需要与框架/表格中的行数相同的长度。

来自?Extract(包括[ 和朋友):

      For '['-indexing only: 'i', 'j', '...' can be logical
      vectors, indicating elements/slices to select.  Such vectors
      are recycled if necessary to match the corresponding extent.
      'i', 'j', '...' can also be negative integers, indicating
      elements/slices to leave out of the selection.

“回收”是长度 1 起作用的原因:它的逻辑值用于所有行。如果您使用长度 2 并且有偶数行(例如,mtcars[c(T,F),]),那么它将给出每隔一行。同样,如果您假设回收并且没有偶数行(例如,mtcars[c(T,F,F),]),那么您的假设开始变得不那么清晰。

添加data.table 的行为,它不强制执行此操作。回收会给你带来麻烦,所以data.table 不鼓励这样做。

library(data.table)
mt <- as.data.table(mtcars)
mt[c(T,F),] <- NA
# Error in `[.data.table`(x, i, which = TRUE) : 
#   i evaluates to a logical vector length 2 but there are 32 rows. Recycling of logical i is no longer allowed as it hides more bugs than is worth the rare convenience. Explicitly use rep(...,length=.N) if you really need to recycle.
mt[c(1,3),] <- NA

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2022-01-20
    • 2018-07-15
    • 2021-06-30
    • 2016-05-20
    • 2018-12-31
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多