【发布时间】:2017-06-01 17:06:15
【问题描述】:
我正在为以下任务寻找 dplyr-ish 解决方案。我有一个数据框,其中包含一个变量,该变量是具有属性 dimnames 的列表列表。这些列表具有不同的长度。这是str(df)的输出:
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 3 obs. of 2 variables:
$ Step : int 1 2 3
$ Value:List of 3
..$ : num [1:2, 1:2] 0.232 0.261 0.932 0.875
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr "4" "5"
.. .. ..$ : chr "0.2" "0.094"
..$ : num [1:2, 1:5] 0.197 0.197 0.64 0.643 0.958 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr "4" "5"
.. .. ..$ : chr "0.2" "0.094" "0.044" "0.021" ...
..$ : num [1:2, 1] 0.268 0.262
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr "4" "5"
.. .. ..$ : chr "0.2"
我在下面包含了 dput 代码来重新创建这个数据框。
我想要以下格式的数据框:
Step Value a b
1 0.232 4 0.200
1 0.261 5 0.200
1 0.932 4 0.094
1 0.875 5 0.094
1 NA 4 0.044
1 NA 5 0.044
1 NA 4 0.021
1 NA 5 0.021
1 NA 4 0.010
1 NA 5 0.010
2 0.197 4 0.200
2 0.197 5 0.200
2 0.640 4 0.094
2 0.643 5 0.094
2 0.958 4 0.044
2 1.032 5 0.044
2 0.943 4 0.021
2 1.119 5 0.021
2 0.943 4 0.010
2 1.119 5 0.010
3 0.268 4 0.200
3 0.262 5 0.200
3 NA 4 0.094
3 NA 5 0.094
3 NA 4 0.044
3 NA 5 0.044
3 NA 4 0.021
3 NA 5 0.021
3 NA 4 0.010
3 NA 5 0.010
其中变量a 是dimnames 列表的行名,b 是列名。
我尝试了一个for 循环来逐步分离每个列表,但是
1) 我没有成功用NAs 填充列表(length(x) <- y 不起作用)。
2) 我已经查看了 advanced R data types,但未能成功将 dimnames 提取到向量中以用作数据框列(attr(df$Value, "dimnames") 产生 NULL。)
一旦我有了相同长度的列表,我就可以在for 循环中逐步构建新的数据帧向量,然后再进行 rbind。或者有没有办法使用 dimname 属性直接使用行和列的暗名作为数据框列名来构建宽数据框?然后我可以gather 制作一个长数据框。
这里有几个子问题,我确信有一个比我制定的解决方案更优雅的解决方案。感谢观看。
这是创建数据框的 dput 代码:
df <- structure(list(Step = c(1L, 2L, 3L), Value = list(structure(c(0.232,
0.261, 0.932, 0.875), .Dim = c(2L,
2L), .Dimnames = list(c("4", "5"), c("0.2", "0.094"
))), structure(c(0.197, 0.197, 0.640,
0.643, 0.958, 1.032, 0.943,
1.119, 0.943, 1.119), .Dim = c(2L,
5L), .Dimnames = list(c("4", "5"), c("0.2", "0.094",
"0.044", "0.021", "0.01"))), structure(c(0.268,
0.262), .Dim = c(2L, 1L), .Dimnames = list(c("4",
"5"), "0.2")))), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-3L), .Names = c("Step", "Value"))
【问题讨论】:
-
看起来该变量是矩阵列表,而不是列表列表?
-
可能是,
str(df$Value[[1]])产生num [1:2, 1:2] 0.232 0.261 0.932 0.875 - attr(*, "dimnames")=List of 2 ..$ : chr [1:2] "4" "5" ..$ : chr [1:2] "0.2" "0.094",但不是矩阵,是具有维度属性的列表,我仍然需要使用 dimnames 作为变量转换为长数据框。我想不出办法来解开这个物体。 -
是的,
num [1:2, 1:2]表示二维数值数组,即矩阵。只有 dimnames 是一个列表。