我正在寻找一种特定的数据转换为列表格式。我想要的最好用示例数据解释:
library(dplyr)
data <- as.data.frame(cbind(matrix(1:4, 10, 1, byrow=T), matrix(2:6, 10, 1, byrow=T), matrix(2:7, 10, 1, byrow=T))) %>%
dplyr::group_by(V1) %>%
dplyr::arrange(.by_group = TRUE)
data # For emphasis "grouped by" V1
# A tibble: 10 x 3
# Groups: V1 [4]
V1 V2 V3
<int> <int> <int>
1 2 2
1 6 6
1 5 4
2 3 3
2 2 7
2 6 5
3 4 4
3 3 2
4 5 5
4 4 3
目的是获得以下格式的列表,其中V1用作拆分(或组)变量,列V2和V3成为V1的分离子列表:
str(list(list(c(2,6,5),c(2,6,4)), list(c(3,2,6),c(3,7,5)),list(c(4,3),c(4,2)), list(c(5,4),c(5,3))))
List of 4
$ :List of 2
..$ : num [1:3] 2 6 5
..$ : num [1:3] 2 6 4
$ :List of 2
..$ : num [1:3] 3 2 6
..$ : num [1:3] 3 7 5
$ :List of 2
..$ : num [1:2] 4 3
..$ : num [1:2] 4 2
$ :List of 2
..$ : num [1:2] 5 4
..$ : num [1:2] 5 3
正如您所看到的,我获得的列表与V1中的不同值一样多。在每个列表中,属于特定值V1的列V2和V3的条目被定义为单独的列表。
现在我正在寻找的是一个特定的“公式”来为我做这件事。我已经尝试了lapply / mapply / split的各种组合,但到目前为止我没有成功。
答案 0 :(得分:2)
我们可以split
'数据',转换为list
library(purrr)
library(dplyr)
lst <- split(data[-1], data[1]) %>%
map(as.list)
或另一种方法是nest
,提取.$data
并转换为list
lst2 <- data %>%
nest(V2, V3) %>%
.$data %>%
map(as.list)
str(lst2)
#List of 4
# $ :List of 2
# ..$ V2: int [1:3] 2 6 5
# ..$ V3: int [1:3] 2 6 4
# $ :List of 2
# ..$ V2: int [1:3] 3 2 6
# ..$ V3: int [1:3] 3 7 5
# $ :List of 2
# ..$ V2: int [1:2] 4 3
# ..$ V3: int [1:2] 4 2
# $ :List of 2
# ..$ V2: int [1:2] 5 4
# ..$ V3: int [1:2] 5 3
此外,可以使用unname
lst2 %>%
map(unname) %>%
str