R просто обновить список data.tables списком - такого уровня нет на уровне 1 - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь обновить список date.tables списком, который, кажется, должен работать, как в этом примере:

set.seed(1965)
dt_lst <- list(dt1 <- data.table(a = rnorm(1:4),
b = c(4,3,2,1)), dt2 <- data.table(c = rnorm(1:5),
d = letters[1:5]))

> dt_lst
[[1]]
        a b
1:  0.8428429 4
2:  0.2958355 3
3: -1.0520980 2
4:  0.9628192 1

[[2]]
         c d
1: -0.05033855 a
2: -0.94065157 b
3:  1.20459624 c
4: -0.47791557 d
5: -0.30362496 e

Теперь список для обновления (кто-то сказал dt1была группа 1, и dt2 была группа 2, и группа должна была быть в результатах):

group1 <- список (1,2) </p>

И обновление:

dt_lst_tst <- lapply(seq_along(dt_lst),
function(x)
dt_lst[[x]][, group:= group1[[x]]])

> dt_lst_tst
[[1]]
        a b group
1:  0.8428429 4     1
2:  0.2958355 3     1
3: -1.0520980 2     1
4:  0.9628192 1     1

[[2]]
         c d group
1: -0.05033855 a     2
2: -0.94065157 b     2
3:  1.20459624 c     2
4: -0.47791557 d     2
5: -0.30362496 e     2

Совершенно и характерно для моих данных, где я никогда не знаю, насколько большой у меня будет таблица данных (nrows), и в какой «группе» она должна быть до факта, следовательно, обновление.

Так что теперь, с очень небольшим количеством моих данных:

> dput(combine_sub1)
list(structure(list(smp = 1:4, x = c(491, 491, 491, 491), y = c(798, 
798, 798, 798)), .Names = c("smp", "x", "y"), class = c("data.table", 
"data.frame"), row.names = c(NA, -4L), .internal.selfref = <pointer: 
0x2b859d8>), 
structure(list(smp = 1:6, x = c(650, 650, 650, 650, 650, 
650), y = c(437, 437, 437, 437, 437, 437)), .Names = c("smp", 
"x", "y"), class = c("data.table", "data.frame"), row.names = c(NA, 
-6L), .internal.selfref = <pointer: 0x2b859d8>), structure(list(
    smp = 1:5, x = c(480, 485, 540, 572, 589), y = c(462, 
    462, 455, 451, 450)), .Names = c("smp", "x", "y"), class = 
c("data.table", 
"data.frame"), row.names = c(NA, -5L), .internal.selfref = <pointer: 
0x2b859d8>))

> combine_sub1
[[1]]
   smp   x   y
1:   1 491 798
2:   2 491 798
3:   3 491 798
4:   4 491 798

[[2]]
   smp   x   y
1:   1 650 437
2:   2 650 437
3:   3 650 437
4:   4 650 437
5:   5 650 437
6:   6 650 437

[[3]]
   smp   x   y
1:   1 480 462
2:   2 485 462
3:   3 540 455
4:   4 572 451
5:   5 589 450

group3_lst <- list(1,2,3)

> group3_lst
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

И с использованием аналогичной лапы, как указано выше:

> combine_sub1_tst <- lapply(seq_along(combine_sub1),
+ function(x)
+ combine_sub1[[x]][ , group := group3_lst[[x]]])
Error in group3_lst[[x]] : no such index at level 1

И я не могу понять, почему разница.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 20 мая 2018

Похоже, что проблема была вызвана использованием переменной x в вызове функции, которая мешает столбцу x в data.tables в group3_lst.Используйте имя переменной разницы, которого нет в этих data.tables, оно будет работать нормально, например, используйте i: combine_sub1_tst <- lapply(seq_along(combine_sub1), function(i) combine_sub1[[i]][ , group := group3_lst[[i]]])

...