从列表中获取向量的最后一个元素,并从中创建一个新向量

时间:2019-03-08 09:32:39

标签: r list

我想从列表的最后一个元素创建一个数据框。我在这里描述了两种情况,一种比较简单,一种比较复杂。

简单案例

让我们假设一个列表或两个向量v

v <- list("22" = c(2, 3, 5), "23" = c("aa", "bb")) 
> str(v)
List of 2
 $ 22: num [1:3] 2 3 5
 $ 23: chr [1:2] "aa" "bb"

我想要一个数据框,在第一列中,我将具有元素名称(此处为22和23),在第二列中,我将具有该向量的最后一个元素。

我可以编写以下代码来生成我想要的东西,

last_elems1 <- lapply(v, tail, n = 1L)
last_elems1 <- data.frame(last_elems1) 
tidyr::gather(last_elems1)

> tidyr::gather(last_elems1)
  key value
1 X22     5
2 X23    bb

我在这里有以下问题,

  1. 如何避免在“键”列中使用“ X”,例如,我只需要数字22,而不是X22。
  2. 我应该担心错误消息吗?

    警告信息: 度量变量之间的属性不相同; 他们将被丢弃

稍作补充的示例

在这里,我有两个(或更多)数据帧的列表,其中包含两个向量。可以如下生成列表,

w <- list("22" = data.frame(a = c(2, 3, 5), 
                            b = c(5, 6, 8)), 
          "23" = data.frame(a = c(9, 10), 
                            b = c(11, 12))
          )
> str(w)
List of 2
 $ 22:'data.frame': 3 obs. of  2 variables:
  ..$ a: num [1:3] 2 3 5
  ..$ b: num [1:3] 5 6 8
 $ 23:'data.frame': 2 obs. of  2 variables:
  ..$ a: num [1:2] 9 10
  ..$ b: num [1:2] 11 12

我想必须在列表内的每个数据帧中最后放置变量b的元素。我正在使用与上述相同的代码,因此,我得到了以下

last_elems2 <- lapply(w, tail, n = 1L)
last_elems2 <- data.frame(last_elems2)
tidyr::gather(last_elems2)

> tidyr::gather(last_elems2)
    key value
1 X22.a     5
2 X22.b     8
3 X23.a    10
4 X23.b    12

这是我的问题,

  1. 如何在key列中使用值,例如22而不是X22.b
  2. 我只需要第2行和第4行。也就是说,输出应为
tidyr::gather(last_elems2)
   key value
1   22     8
2   23    12

有什么想法可以微调我在做什么吗?

1 个答案:

答案 0 :(得分:1)

基本R选项

stack(lapply(w, function(x) {
  x[dim(x)[1], "b"] # return last element of column "b"
}))
#  values ind
#1      8  22
#2     12  23

当我们使用dim时,我们假设w不包含向量-因为向量没有维度属性。然后,您需要将该部分更改为x[length(x)]

数据

w <- list("22" = data.frame(a = c(2, 3, 5), 
                            b = c(5, 6, 8)), 
          "23" = data.frame(a = c(9, 10), 
                            b = c(11, 12))
)