R 从数据帧列表迭代打印
我试图探索一个大型数据集,包括数据框架和图表。我想通过不同的指标(如sum(x)、sum(x*y))和不同的子总体来分析每个变量的分布。我有4个子群体、2个指标和许多变量 为了实现这一点,我制作了如下列表结构:R 从数据帧列表迭代打印,r,ggplot2,nested-lists,R,Ggplot2,Nested Lists,我试图探索一个大型数据集,包括数据框架和图表。我想通过不同的指标(如sum(x)、sum(x*y))和不同的子总体来分析每个变量的分布。我有4个子群体、2个指标和许多变量 为了实现这一点,我制作了如下列表结构: $variable1 ...$metric1 <--- that's a df. ...$metric2 $variable2 ...$metric1 ...$metric2 我想弄明白的是一种很好的方法,可以循环浏览列表列表(可能会在过程中融化DFs),然后输出大量条形
$variable1
...$metric1 <--- that's a df.
...$metric2
$variable2
...$metric1
...$metric2
我想弄明白的是一种很好的方法,可以循环浏览列表列表(可能会在过程中融化DFs),然后输出大量条形图。在这种情况下,对于每个数据帧,自然绘图格式将是一个堆叠条形图,每个子总体有一个堆叠条形图,按变量的唯一值分组
但我不熟悉迭代绘图,所以我已经走到了死胡同。我如何从列表结构中进行绘图?或者,是否有更好的结构来存储这些信息?以下是一个开始:
lst <- list(alpha= list(a= data.frame(matrix(1:4, 2)), b= data.frame(matrix(6:11, 2))),
beta = list(c = data.frame(matrix(11:14, 2))))
lst
$alpha
$alpha$a
X1 X2
1 1 3
2 2 4
$alpha$b
X1 X2 X3
1 6 8 10
2 7 9 11
$beta
$beta$c
X1 X2
1 11 13
2 12 14
#We can subset by number or by name
lst[['alpha']]
$a
X1 X2
1 1 3
2 2 4
$b
X1 X2 X3
1 6 8 10
2 7 9 11
lst[[1]]
$a
X1 X2
1 1 3
2 2 4
$b
X1 X2 X3
1 6 8 10
2 7 9 11
#The dollar sign naming convention reminds us that we are looking at a list.
#Let's sum the columns of both data frames in the alpha list
lapply(lst[['alpha']], colSums)
$a
X1 X2
3 7
$b
X1 X2 X3
13 17 21
发生了什么事?R正确地拒绝在列表上运行数组函数。函数colSums
需要提供一维以上的数据帧、矩阵和其他数组。我们必须在另一个函数中嵌套一个lappy
函数。逻辑可能变得复杂:
lapply(lst, function(x) lapply(x, colSums))
$alpha
$alpha$a
X1 X2
3 7
$alpha$b
X1 X2 X3
13 17 21
$beta
$beta$c
X1 X2
23 27
我们可以使用rbind
将data.frames放在一起:
rbind(lst$alpha$a, lst$beta$c)
X1 X2
1 1 3
2 2 4
3 11 13
4 12 14
请确保不要按照您可能认为的方式来做(我已经做了很多次):
这不是你想要的结果。并确保维度和列名相同:
do.call(rbind, lst[[1]])
Error in rbind(deparse.level, ...) :
numbers of columns of arguments do not match
R拒绝合并一个(alpha$a)中有两列,另一个(alpha$b)中有三列的数据帧
我更改了lst
,使alpha$b
具有与其他列类似的两列,并将它们组合在一起:
bind1 <- lapply(lst2, function(x) do.call(rbind, x))
bind1
$alpha
X1 X2
a.1 1 3
a.2 2 4
b.1 6 9
b.2 7 10
b.3 8 11
$beta
X1 X2
c.1 11 13
c.2 12 14
这是一个开始:
lst <- list(alpha= list(a= data.frame(matrix(1:4, 2)), b= data.frame(matrix(6:11, 2))),
beta = list(c = data.frame(matrix(11:14, 2))))
lst
$alpha
$alpha$a
X1 X2
1 1 3
2 2 4
$alpha$b
X1 X2 X3
1 6 8 10
2 7 9 11
$beta
$beta$c
X1 X2
1 11 13
2 12 14
#We can subset by number or by name
lst[['alpha']]
$a
X1 X2
1 1 3
2 2 4
$b
X1 X2 X3
1 6 8 10
2 7 9 11
lst[[1]]
$a
X1 X2
1 1 3
2 2 4
$b
X1 X2 X3
1 6 8 10
2 7 9 11
#The dollar sign naming convention reminds us that we are looking at a list.
#Let's sum the columns of both data frames in the alpha list
lapply(lst[['alpha']], colSums)
$a
X1 X2
3 7
$b
X1 X2 X3
13 17 21
发生了什么事?R正确地拒绝在列表上运行数组函数。函数colSums
需要提供一维以上的数据帧、矩阵和其他数组。我们必须在另一个函数中嵌套一个lappy
函数。逻辑可能变得复杂:
lapply(lst, function(x) lapply(x, colSums))
$alpha
$alpha$a
X1 X2
3 7
$alpha$b
X1 X2 X3
13 17 21
$beta
$beta$c
X1 X2
23 27
我们可以使用rbind
将data.frames放在一起:
rbind(lst$alpha$a, lst$beta$c)
X1 X2
1 1 3
2 2 4
3 11 13
4 12 14
请确保不要按照您可能认为的方式来做(我已经做了很多次):
这不是你想要的结果。并确保维度和列名相同:
do.call(rbind, lst[[1]])
Error in rbind(deparse.level, ...) :
numbers of columns of arguments do not match
R拒绝合并一个(alpha$a)中有两列,另一个(alpha$b)中有三列的数据帧
我更改了lst
,使alpha$b
具有与其他列类似的两列,并将它们组合在一起:
bind1 <- lapply(lst2, function(x) do.call(rbind, x))
bind1
$alpha
X1 X2
a.1 1 3
a.2 2 4
b.1 6 9
b.2 7 10
b.3 8 11
$beta
X1 X2
c.1 11 13
c.2 12 14
我发现嵌套列表很难处理,所以我会将它们合并到一个数据框中,该数据框标记变量名称和度量名称:
lst <- list(alpha= list(a= data.frame(matrix(1:4, 2)), b= data.frame(matrix(6:9, 2))), beta = list(c = data.frame(matrix(11:14, 2))))
level1 <- lapply(lst, function(x) do.call(rbind, lapply(names(x), function(y) {x[[y]]$metric=y ; x[[y]]})))
dat <- do.call(rbind, lapply(names(level1), function(x) {level1[[x]]$variable=x ; level1[[x]]}))
dat
# X1 X2 metric variable
# 1 1 3 a alpha
# 2 2 4 a alpha
# 3 6 8 b alpha
# 4 7 9 b alpha
# 5 11 13 c beta
# 6 12 14 c beta
lst我发现嵌套列表很难处理,所以我会将它们合并到一个数据框中,该数据框标记变量名称和度量名称:
lst <- list(alpha= list(a= data.frame(matrix(1:4, 2)), b= data.frame(matrix(6:9, 2))), beta = list(c = data.frame(matrix(11:14, 2))))
level1 <- lapply(lst, function(x) do.call(rbind, lapply(names(x), function(y) {x[[y]]$metric=y ; x[[y]]})))
dat <- do.call(rbind, lapply(names(level1), function(x) {level1[[x]]$variable=x ; level1[[x]]}))
dat
# X1 X2 metric variable
# 1 1 3 a alpha
# 2 2 4 a alpha
# 3 6 8 b alpha
# 4 7 9 b alpha
# 5 11 13 c beta
# 6 12 14 c beta
lst这里有一个基于融化列表(递归)的策略
这是一个基于融化列表(递归)的策略
要处理列表列表,您需要很好地处理列表子集。根据dfs的结构,将它们组合起来可能会有所帮助。如果您想进行小倍数绘图,我建议您使用的软件包需要对列表子集有良好的处理才能使用列表列表。根据dfs的结构,将它们组合起来可能会有所帮助。如果您想制作小倍数绘图,我建议使用该软件包