数据内容以特定形式列入列表

时间:2017-10-19 11:57:35

标签: r list transformation

我正在寻找一种特定的数据转换为列表格式。我想要的最好用示例数据解释:

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的各种组合,但到目前为止我没有成功。

1 个答案:

答案 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

删除名称“V2”,“V3”
lst2 %>%
    map(unname) %>%
    str