У меня есть некоторые data.tables
так:data.table назначая с `sapply` в слиянии
x <- data.table(id=rep(1:3, 2), a=1:6)
y <- data.table(id=1:3, b=2:4)
я могу объединить их, как это:
setkey(x, id)
setkey(y, id)
x[y]
id a b
1: 1 1 2
2: 1 4 2
3: 2 2 3
4: 2 5 3
5: 3 3 4
6: 3 6 4
Теперь я хочу, чтобы создать новый колонка в x
основана на a
и b
, которая является суммой a
и b
. я могу сделать это с помощью:
x[y, val:=a + b]
Однако теперь, по какой-то причине, что оператор «+» не vectorised. Как я могу отсортировать по строкам в x
, где x[y]
необходим для расчета? Кроме того, предположим, что я не могу использовать mapply
(потому что для моей фактической проблемы mapply
не подходит для этой функции).
Я пытаюсь использовать sapply
как так, чтобы добавить в строчном порядке:
x[y, sapply(1:nrow(x), function (i) a[i] + b[i])]
Однако это возвращает неправильный результат:
id V1
1: 1 3
2: 1 NA
3: 1 NA
4: 1 NA
5: 1 NA
6: 1 NA
7: 2 5
8: 2 NA
9: 2 NA
10: 2 NA
11: 2 NA
12: 2 NA
13: 3 7
14: 3 NA
15: 3 NA
16: 3 NA
17: 3 NA
18: 3 NA
Если я делаю это работает:
x[y][, sapply(1:nrow(x), function (i) a[i] + b[i])]
# [1] 3 6 5 8 7 10
НО когда я пытаюсь и назначить это для столбца в x
, он не сохраняется (имеет смысл, потому что похоже, что я пытаюсь сохранить новый столбец в x[y]
).
x[y][, val:=sapply(1:nrow(x), function (i) a[i] + b[i])]
Есть ли способ сделать выше, но сохранить вывод в x[, val]
? Это как я должен это делать, или есть еще data.table
-y way?
x[, val:=x[y][, sapply(1:nrow(x), function (i) a[i] + b[i])]]
Это будет легче ответить, если вы дадите лучший пример функции, которую вы хотите векторизовать. – mnel