У меня есть список data.frames и я хочу подмножить часть dataframes.
В этом случае я хочу подмножить rainfall
и yield
в sublist1 and sublist2
из mainlist
и создать новый список с именем mainlist_new
.
Но я столкнулся с этой ошибкой Error in mainlist[[1]][[, 2:3]] : incorrect number of subscripts
.
Есть идеи и мысли?
вот code
и создал data
> df1 <- data.frame(station = c("MADA1", "MADA2", "MADA3", "MADA4", "MADA5"),
+ rainfall = c(0, 5, 10, 15, 20),
+ yield = c(2000, 3000, 4000, 5000, 6000))
> df2 <- df1
> df3 <- df1
>
> list_1 <- list(df1, df2, df3)
>
> list_2 <- list(df1, df2, df3)
>
> mainlist <- list(list_1, list_2)
> names(mainlist) <- c("sublist1", 'sublist2')
> names(mainlist[[1]]) <- c("station", "rainfall", "yield")
> names(mainlist[[2]]) <- c("station", "rainfall", "yield")
>
> names(mainlist)
[1] "sublist1" "sublist2"
> names(mainlist[[1]])
[1] "station" "rainfall" "yield"
>
> # subset `rainfall` and `yield` is sublist1 and sublist2 and create a a new list
> mainlist_new <- list()
> mainlist_new[[1]] <- mainlist[[1]][[,2:3]]
Error in mainlist[[1]][[, 2:3]] : incorrect number of subscripts
> mainlist_new[[2]] <- mainlist[[2]][[,2:3]]
Error in mainlist[[2]][[, 2:3]] : incorrect number of subscripts
>
Если мы хотим разделить элементы list
на основе имен
mainlist_new <- lapply(mainlist, `[`, c("rainfall", "yield"))
-выход
> str(mainlist_new)
List of 2
$ :List of 2
..$ rainfall:'data.frame': 5 obs. of 3 variables:
.. ..$ station : chr [1:5] "MADA1" "MADA2" "MADA3" "MADA4" ...
.. ..$ rainfall: num [1:5] 0 5 10 15 20
.. ..$ yield : num [1:5] 2000 3000 4000 5000 6000
..$ yield :'data.frame': 5 obs. of 3 variables:
.. ..$ station : chr [1:5] "MADA1" "MADA2" "MADA3" "MADA4" ...
.. ..$ rainfall: num [1:5] 0 5 10 15 20
.. ..$ yield : num [1:5] 2000 3000 4000 5000 6000
$ :List of 2
..$ rainfall:'data.frame': 5 obs. of 3 variables:
.. ..$ station : chr [1:5] "MADA1" "MADA2" "MADA3" "MADA4" ...
.. ..$ rainfall: num [1:5] 0 5 10 15 20
.. ..$ yield : num [1:5] 2000 3000 4000 5000 6000
..$ yield :'data.frame': 5 obs. of 3 variables:
.. ..$ station : chr [1:5] "MADA1" "MADA2" "MADA3" "MADA4" ...
.. ..$ rainfall: num [1:5] 0 5 10 15 20
.. ..$ yield : num [1:5] 2000 3000 4000 5000 6000
Если вы хотите подмножить list
на index
в нескольких позициях, вы можете использовать одинарные квадратные скобки [
вместо двойных [[
. Тогда он должен вести себя так, как вы ожидаете. Разница между этими операторами подмножества хорошо объясняется здесь и здесь.
В вашем примере все, что вам нужно сделать, это изменить mainlist_new[[1]] <- mainlist[[1]][[,2:3]]
на mainlist_new[[1]] <- mainlist[[1]][2:3]
.
Простой пример здесь:
# create list
l <- as.list(1:4)
# subset list by index
l[2:3]
#> [[1]]
#> [1] 2
#>
#> [[2]]
#> [1] 3
Created on 2022-04-08 by the reprex package (v2.0.1)
Вы уверены, что случайно не создали пример со слишком глубоко вложенным списком?