我想从列表的最后一个元素创建一个数据框。我在这里描述了两种情况,一种比较简单,一种比较复杂。
简单案例
让我们假设一个列表或两个向量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
我在这里有以下问题,
我应该担心错误消息吗?
警告信息: 度量变量之间的属性不相同; 他们将被丢弃
稍作补充的示例
在这里,我有两个(或更多)数据帧的列表,其中包含两个向量。可以如下生成列表,
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
这是我的问题,
key
列中使用值,例如22
而不是X22.b
。2
行和第4
行。也就是说,输出应为tidyr::gather(last_elems2) key value 1 22 8 2 23 12
有什么想法可以微调我在做什么吗?
答案 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))
)