首页 > 解决方案 > R:尝试使用另一个 data.table 对列进行操作时,data.table 中的奇怪行为

问题描述

我正在尝试使用不同的 data.table 对 data.table 列进行操作,并将结果分配给第一个 data.table 中的新列。但我一直有这个问题:

Warning messages:
1: In from:(from + len) :
  numerical expression has 10 elements: only the first used

这是数据:

tstamps = c(1504306173, NA, NA, NA, NA, 1504393006, NA, NA, 1504459211, NA)
set.seed(0.1)
dt1 = data.table(utc_tstamp = sample(rep(tstamps, 100), 100))
dt2 = data.table(from = sample((1:90), 10), len = sample(1:10, 10))

> dt2
    from len
 1:   55   6
 2:   59   9
 3:   32  10
 4:   24   3
 5:   86   7
 6:   54   1
 7:   18   5
 8:   11   8
 9:   40   4
10:   75   2

我正在尝试计算NA' 的数量dt1[from:(from+len), ]并将结果分配给一个新列 count, in dt2

我目前拥有的是这个

dt2[, count := dt1[from:(from+len), ][is.na(utc_tstamp), .N]]

但这只是使用dt2[1,]$fromand dt2[1,]$len,所有计数都只是NA's in的数量dt1[dt2[1,]$from:(dt2[1,]$from + dt2[1,]$len), ],我收到以下警告

Warning messages:
1: In from:(from + len) :
  numerical expression has 10 elements: only the first used
2: In from:(from + len) :
  numerical expression has 10 elements: only the first used

结果是这样的:

> dt2
    from len count
 1:   55   6     5
 2:   59   9     5
 3:   32  10     5
 4:   24   3     5
 5:   86   7     5
 6:   54   1     5
 7:   18   5     5
 8:   11   8     5
 9:   40   4     5
10:   75   2     5

虽然应该是这样的:

> dt2
    from len count
 1:   55   6     5
 2:   59   9     5
 3:   32  10     8
 4:   24   3     3
 5:   86   7     5
 6:   54   1     2
 7:   18   5     4
 8:   11   8     5
 9:   40   4     4
10:   75   2     2

如果有人解释为什么会发生这种情况以及我怎样才能得到我想要的东西,我将不胜感激。

标签: rdata.table

解决方案


根据描述,我们得到'from'和'from'之间加上'len'的序列,根据这个位置索引从'dt1'中获取'utc_stamp'列的对应元素,将其转换为逻辑(is.na(),并得到sumTRUE 元素的总和或元素的数量NA。分配(:=)它以在“df2”中创建一个新列“count”

dt2[, count := unlist(Map(function(x, y) 
              sum(is.na(dt1$utc_tstamp[x:y])),  from , from + len))]
dt2
#    from len count
# 1:   55   6     5
# 2:   59   9     5
# 3:   32  10     8
# 4:   24   3     3
# 5:   86   7     5
# 6:   54   1     2
# 7:   18   5     4
# 8:   11   8     5
# 9:   40   4     4
#10:   75   2     2

或者另一种选择是按行序列分组,然后:根据'from','len'列执行序列(),以从'dt1'中获取列值的子集并获取sum逻辑vector

dt2[, count := sum(is.na(dt1$utc_tstamp[from:(from + len)])), by = 1:nrow(dt2)]

推荐阅读