选择列表中数据框的最长元素

时间:2018-03-09 10:43:47

标签: r

我有以下列表,包含多个数据框 列表中每个数据帧的长度为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"))

2 个答案:

答案 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)包装输出。