我正在尝试使用其他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), ]
的数量,并将结果分配到dt2
中一个新列count。
我目前为此拥有的是
dt2[, count := dt1[from:(from+len), ][is.na(utc_tstamp), .N]]
但这只是使用dt2[1,]$from
和dt2[1,]$len
,所有计数只是NA
中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
如果有人解释为什么会发生这种情况以及如何获得所需的东西,我将不胜感激。
答案 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]