我如何做一个数据帧的列表,我如何从列表中访问每个这些数据帧?
例如,如何将这些数据帧放入列表中?
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))
我如何做一个数据帧的列表,我如何从列表中访问每个这些数据帧?
例如,如何将这些数据帧放入列表中?
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))
当前回答
在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
在编译稍后要按名称引用的列表时,这可能很有帮助。
其他回答
还可以使用[和[[]访问每个列表元素中的特定列和值。这里有几个例子。首先,使用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
我认为自己是一个完全的新手,但我认为对于这里没有陈述的原始子问题之一,我有一个极其简单的答案:访问数据帧或数据帧的一部分。
让我们首先创建上面所述的数据帧列表:
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))
my.list <- list(d1, d2)
然后,如果希望访问其中一个数据帧中的特定值,可以按顺序使用双括号。第一组让你进入数据帧,第二组让你到达特定的坐标:
my.list[[1]][3, 2]
[1] 6
在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
在编译稍后要按名称引用的列表时,这可能很有帮助。
假设你有“大量”名称相似的data.frames(这里的d#是一个正整数),下面的方法是对@mark-miller方法的轻微改进。它更简洁,返回data.frames的命名列表,其中列表中的每个名称都是对应的原始data.frame的名称。
关键是使用mget和ls。如果问题中提供的数据帧d1和d2是环境中仅有的名称为d#的对象,那么
my.list <- mget(ls(pattern="^d[0-9]+"))
它会返回
my.list
$d1
y1 y2
1 1 4
2 2 5
3 3 6
$d2
y1 y2
1 3 6
2 2 5
3 1 4
这个方法利用了ls中的pattern参数,它允许我们使用正则表达式对环境中对象的名称进行更精细的解析。另一个正则表达式”^ d[0 - 9] + $”是“^ \ \ d +美元”。
正如@gregor指出的那样,从整体上讲,更好的方法是设置数据构建过程,以便在开始时将data.frames放入命名列表中。
data
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))
这可能有点晚了,但回到你的例子,我想我可以稍微扩展一下答案。
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)
希望这一点能有所帮助。
干杯!