如何对一个数据框列表进行子集操作?

3

我有一个data.frames的列表,并想要对数据框的部分进行子集操作。 在这种情况下,我想要在mainlistsublist1和sublist2中对rainfall和yield进行子集操作,并创建一个名为mainlist_new的新列表。

但是我遇到了错误Error in mainlist[[1]][[, 2:3]] : incorrect number of subscripts

有任何想法或思路吗?

这里是代码和创建的数据

> 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
>

你确定没有意外创建一个嵌套层次太深的列表示例吗? - jay.sf
2个回答

1
如果我们想要根据名称对列表元素进行子集划分。
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

1
如果您想通过索引在多个位置对列表进行子集,可以使用单方括号[而不是双方括号[[。这样它应该按照您的预期行为。这些子集运算符之间的区别在这里这里中得到了很好的解释。
在您的示例中,您需要做的就是将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

创建于2022年4月8日,使用reprex包(v2.0.1)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接