我如何做一个数据帧的列表,我如何从列表中访问每个这些数据帧?

例如,如何将这些数据帧放入列表中?

d1 <- data.frame(y1 = c(1, 2, 3),
                 y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
                 y2 = c(6, 5, 4))

当前回答

非常简单!以下是我的建议:

如果你想在你的工作空间中选择数据框架,试试这个:

Filter(function(x) is.data.frame(get(x)) , ls())

or

ls()[sapply(ls(), function(x) is.data.frame(get(x)))]

所有这些都会得到相同的结果。

你可以改变is.data.frame来检查其他类型的变量,比如is.function

其他回答

对于循环模拟

如果我有一个生成数据框架的for循环,我从一个空list()开始,并在生成数据框架时附加数据框架。

# Empty list
dat_list <- list()

for(i in 1:5){
    # Generate dataframe
    dat <- data.frame(x=rnorm(10), y=rnorm(10))
    # Add to list
    dat_list <- append(dat_list, list(dat))
}

注意,它是在append()调用中的list(dat)。

访问数据

然后使用dat_list[[n]]从列表中获取第n个数据帧。你可以通过正常的方式访问这个数据帧中的数据,例如dat_list[[2]]$x。

或者,如果你想从所有的数据框架中获得相同的部分,则使用(dat_list, "[", "x")。

见@Gregor Thomas的回答,没有for循环。

还可以使用[和[[]访问每个列表元素中的特定列和值。这里有几个例子。首先,使用lapply(ldf, "[", 1)只能访问列表中每个数据帧的第一列,其中1表示列号。

ldf <- list(d1 = d1, d2 = d2)  ## create a named list of your data frames
lapply(ldf, "[", 1)
# $d1
#   y1
# 1  1
# 2  2
# 3  3
#
# $d2
#   y1
# 1  3
# 2  2
# 3  1

类似地,我们可以访问第二列中的第一个值

lapply(ldf, "[", 1, 2)
# $d1
# [1] 4
# 
# $d2
# [1] 6

然后我们还可以直接访问列值,作为一个向量,使用[[

lapply(ldf, "[[", 1)
# $d1
# [1] 1 2 3
#
# $d2
# [1] 3 2 1

非常简单!以下是我的建议:

如果你想在你的工作空间中选择数据框架,试试这个:

Filter(function(x) is.data.frame(get(x)) , ls())

or

ls()[sapply(ls(), function(x) is.data.frame(get(x)))]

所有这些都会得到相同的结果。

你可以改变is.data.frame来检查其他类型的变量,比如is.function

在tidyverse中,可以使用函数lst()根据对象自动命名列表。

library(tibble)

d1 <- data.frame(y1 = c(1, 2, 3),
                 y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
                 y2 = c(6, 5, 4))

lst(d1, d2)
# $d1
# y1 y2
# 1  1  4
# 2  2  5
# 3  3  6
# 
# $d2
# y1 y2
# 1  3  6
# 2  2  5
# 3  1  4

在编译稍后要按名称引用的列表时,这可能很有帮助。

这可能有点晚了,但回到你的例子,我想我可以稍微扩展一下答案。

 D1 <- data.frame(Y1=c(1,2,3), Y2=c(4,5,6))
 D2 <- data.frame(Y1=c(3,2,1), Y2=c(6,5,4))
 D3 <- data.frame(Y1=c(6,5,4), Y2=c(3,2,1))
 D4 <- data.frame(Y1=c(9,9,9), Y2=c(8,8,8))

然后你就可以很容易地列出清单了:

mylist <- list(D1,D2,D3,D4)

现在你有一个列表,但不是访问列表的旧方式,如

mylist[[1]] # to access 'd1'

你可以使用这个函数来获取和分配你选择的数据框架。

GETDF_FROMLIST <- function(DF_LIST, ITEM_LOC){
   DF_SELECTED <- DF_LIST[[ITEM_LOC]]
   return(DF_SELECTED)
}

现在去买你想要的吧。

D1 <- GETDF_FROMLIST(mylist, 1)
D2 <- GETDF_FROMLIST(mylist, 2)
D3 <- GETDF_FROMLIST(mylist, 3)
D4 <- GETDF_FROMLIST(mylist, 4)

希望这一点能有所帮助。

干杯!