R:尝试使用另一个data.table对列进行操作时data.table中的行为异常

时间:2018-08-03 23:28:55

标签: r 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

我正在尝试计算NAdt1[from:(from+len), ]的数量,并将结果分配到dt2中一个新列count。

我目前为此拥有的是

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

但这只是使用dt2[1,]$fromdt2[1,]$len,所有计数只是NAdt1[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

如果有人解释为什么会发生这种情况以及如何获得所需的东西,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

根据描述,我们获得“ from”和“ from”之间加上“ len”的顺序,根据该位置索引,从“ dt1”获得“ utc_stamp”列的相应元素,并将其转换为逻辑(is.na(),然后获取sum,即TRUE元素的总和或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'中的列值子集化并得到{{ 1}}的逻辑sum

vector

答案 1 :(得分:2)

或显式定义连接变量并使用非等距连接:

dt2[, to := from+len]
dt1[, r := .I]

dt2[, ct := dt1[is.na(utc_tstamp)][dt2, on=.(r >= from, r <= to), .N, by=.EACHI]$N]