我有以下列表,包含多个数据框 列表中每个数据帧的长度为2。
现在我想选择数据框的第一列,其中一列是数据帧中最长的行并选择 列表中所有数据帧的第二列
这是数据集。
> dfs
$a
x a
1 1 0.1995464
2 2 0.9973094
3 3 0.9945370
4 4 0.8478068
5 7 0.2573278
6 8 0.1512301
7 9 0.7213563
8 10 0.6959976
$b
x b
1 1 0.8923419
2 2 0.3823957
3 3 0.3657654
4 4 0.6348854
5 5 0.5990311
$c
x c
1 1 0.041083504
2 2 0.971180447
3 3 0.403722147
4 4 0.001057452
5 5 0.459418331
6 6 0.964972695
每个数据框的维度
> lapply(dfs,function(x) dim(x))
$a
[1] 8 2
$b
[1] 5 2
$c
[1] 6 2
此处a
是最长的行(nrow
。)
因此,数据框的第一列将被选中
所有数据帧的第二列
所需的输出格式:
$x
[1] 1 2 3 4 7 8 9 10
$a
[1] 0.1995464 0.9973094 0.9945370 0.8478068 0.2573278
[6] 0.1512301 0.7213563 0.6959976
$b
[1] 0.8923419 0.3823957 0.3657654 0.6348854 0.5990311
$c
[1] 0.041083504 0.971180447 0.403722147 0.001057452
[5] 0.459418331 0.964972695
> lapply(dfs,function(x) x[,2])
上述代码可以选择所有数据帧的2列 但是如何在datafame中选择Column的最大行。
三江源。
> dput(dfs)
structure(list(a = structure(list(x = c(1L, 2L, 3L, 4L, 7L, 8L,
9L, 10L), a = c(0.199546368792653, 0.997309415135533, 0.994537038262933,
0.847806796897203, 0.257327824598178, 0.151230089599267, 0.721356318565086,
0.695997633039951)), .Names = c("x", "a"), row.names = c(NA,
-8L), class = "data.frame"), b = structure(list(x = 1:5, b = c(0.892341891303658,
0.382395694730803, 0.365765440743417, 0.634885413805023, 0.599031136371195
)), .Names = c("x", "b"), row.names = c(NA, -5L), class = "data.frame"),
c = structure(list(x = 1:6, c = c(0.0410835035145283, 0.971180446678773,
0.403722146525979, 0.00105745159089565, 0.4594183312729,
0.964972694870085)), .Names = c("x", "c"), row.names = c(NA,
-6L), class = "data.frame")), .Names = c("a", "b", "c"))
答案 0 :(得分:2)
我们通过循环遍历< dfs'来提取每个数据集中的行数。使用sapply
(' n1'),获取max
(' n2')和最大值的位置(' n3' )。根据索引,将list
中的第二列进行子集化,并将其附加到具有最大行数的第一列
n1 <- sapply(dfs, nrow)
n2 <- max(n1)
n3 <- which.max(n1)
c(dfs[[n3]][1], lapply(dfs, function(x) head(x[,2], n2)))
#$x
#[1] 1 2 3 4 7 8 9 10
#$a
#[1] 0.1995464 0.9973094 0.9945370 0.8478068 0.2573278 0.1512301 0.7213563 0.6959976
#$b
#[1] 0.8923419 0.3823957 0.3657654 0.6348854 0.5990311
#$c
#[1] 0.041083504 0.971180447 0.403722147 0.001057452 0.459418331 0.964972695
答案 1 :(得分:1)
也许这不是你想要的,但可能是你需要的:
res <- Reduce(function(...) merge(..., all = TRUE), dfs)
res
# x a b c
# 1 1 0.1995464 0.8923419 0.041083504
# 2 2 0.9973094 0.3823957 0.971180447
# 3 3 0.9945370 0.3657654 0.403722147
# 4 4 0.8478068 0.6348854 0.001057452
# 5 5 NA 0.5990311 0.459418331
# 6 6 NA NA 0.964972695
# 7 7 0.2573278 NA NA
# 8 8 0.1512301 NA NA
# 9 9 0.7213563 NA NA
# 10 10 0.6959976 NA NA
输出结果 res 是一个数据框(也是一个列表),如果我们需要显式列表,那么只需用as.list(res)
包装输出。