Как получить индекс определенного data.frame в списке data.frames? - PullRequest
1 голос
/ 11 апреля 2019

Допустим, у меня есть следующие data.frames и список

# data frames
df1 = data.frame(y1 = c(1:5), y2 = c(8:12))
df2 = data.frame(y1 = c(5:8), y2 = c(9:12))
df3 = data.frame(y1 = c(5:8), y2 = c(9:12))
df4 = data.frame(y1 = c(11:15), y2 = c(16:20))

# list of data.frames
my.list <- list(df1, df2, df3, df4)

Я хочу найти позицию df1 в списке, и я попробовал это, но получил NA. Я также попытался ==, но получил ошибку.

match(df1, my.list)
# [1] NA NA

Но когда я это делаю, я получаю результаты

list14 = my.list[c(1,4)]
match(list14, my.list)
# [1] 1 4

Я полагаю, что в списке есть что-то, что можно сделать [] против [[]]. В конечном итоге я хочу сделать что-то вроде

for (i in list14) {
  cbind(list14, "indexPositionOf_list14_in_my.list")
}

где indexPositionOf_list14_in_my.list - индексная позиция соответствующего элемента данных. list14 в my.list.

Ожидаемый результат от for loop

[[1]]
  y1 y2 id
1  1  8  1
2  2  9  1
3  3 10  1
4  4 11  1
5  5 12  1

[[2]]
  y1 y2 id
1 11 16  4
2 12 17  4
3 13 18  4
4 14 19  4
5 15 20  4

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вы можете использовать duplicated и mapply:

mapply(cbind, my.list, id=seq_along(my.list), SIMPLIFY = FALSE)[duplicated(my.list) | duplicated(my.list, fromLast = TRUE)]

[[1]]
  y1 y2 id
1  5  9  2
2  6 10  2
3  7 11  2
4  8 12  2

[[2]]
  y1 y2 id
1  5  9  3
2  6 10  3
3  7 11  3
4  8 12  3

Benchmark

library(rbenchmark)

benchmark("baseR" = {
  mapply(cbind, my.list, id=seq_along(my.list), SIMPLIFY = FALSE)[duplicated(my.list) | duplicated(my.list, fromLast = TRUE)]

},
"map" = {
  mapply(cbind, my.list, id=seq_along(my.list), SIMPLIFY = FALSE) %>% 
    map(., inner_join, df3) %>% 
    map(., compact) %>% 
    compact()
},
replications = 1000,
columns = c("test", "replications", "elapsed",
            "relative", "user.self", "sys.self"))


  test replications elapsed relative user.self
1 baseR         1000    0.37    1.000      0.38
2   map         1000    4.82   13.027      4.80
  sys.self
1     0.00
2     0.02
1 голос
/ 11 апреля 2019

может быть как то так?

my.list<- mapply(cbind, my.list, id=seq_along(my.list), SIMPLIFY = FALSE)

my.list %>% 
  map(., inner_join, df3) %>% 
  map(., compact) %>% 
  compact()
#> Joining, by = c("y1", "y2")
#> Joining, by = c("y1", "y2")
#> Joining, by = c("y1", "y2")
#> Joining, by = c("y1", "y2")
#> [[1]]
#>   y1 y2 id
#> 1  5  9  2
#> 2  6 10  2
#> 3  7 11  2
#> 4  8 12  2
#> 
#> [[2]]
#>   y1 y2 id
#> 1  5  9  3
#> 2  6 10  3
#> 3  7 11  3
#> 4  8 12  3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...