如何在R数据帧中的单个列下嵌套多列对象

如何在R数据帧中的单个列下嵌套多列对象,r,R,假设您有一个矩阵,如: a=矩阵1:20,4,5 其中第1-4列为四维数据点的值,第5列为标签 是否有一种优雅的方法可以使用原生R函数将4-d向量嵌套在一个数据帧的单个列下?从web下载更多专用库的权限受到限制。 基本上,我想以这样的方式结束: Data Label 1 1 5 9 13 17 2 2 6 10 14 18 3 3 7 11 15 19 4 4 8 12 16 20 tidyverse方法是按最后一列进行

假设您有一个矩阵,如:

a=矩阵1:20,4,5

其中第1-4列为四维数据点的值,第5列为标签

是否有一种优雅的方法可以使用原生R函数将4-d向量嵌套在一个数据帧的单个列下?从web下载更多专用库的权限受到限制。 基本上,我想以这样的方式结束:

          Data  Label 
1    1 5 9  13    17
2    2 6 10 14    18
3    3 7 11 15    19
4    4 8 12 16    20
tidyverse方法是按最后一列进行分组,然后嵌套剩余的数据;这需要data.frame或tibble,而不是矩阵

使用purrr::map*函数之一可以轻松地操作生成的数据列

在base R中,您可以执行以下操作

icol <- 5   # The index of the label column 
df <- data.frame(Label = a[ ,icol], Data = I(lapply(as.data.frame(t(a[, -icol])), c)))
df
#   Label         Data
#V1    17  1, 5, 9, 13
#V2    18 2, 6, 10, 14
#V3    19 3, 7, 11, 15
#V4    20 4, 8, 12, 16

这里df是一个带有列表列数据的data.frame。

这是一个输出不同对象的想法,但可以让您了解如何格式化它

setNames(split(c(t(a[,-(5)])), rep(seq(4), each = 4)), a[,5])

#$`17`
#[1]  1  5  9 13

#$`18`
#[1]  2  6 10 14

#$`19`
#[1]  3  7 11 15

#$`20`
#[1]  4  8 12 16

没错,tidyverse会这么做,但我正在寻找原生的R命令,因为脚本可能被移植到一台无法访问web的机器上下载这个库。@flamenco为什么是矩阵;考虑到其中一部分是数据,另一部分对应于标签,data.frame会更有意义。一个矩阵只能有一种数据类型。@flamenco我做了一个编辑,包括一个基本的R解决方案;请看一看。
iris %>%
    group_by(Species) %>%
    nest()
## A tibble: 3 x 2
#  Species    data
#  <fct>      <list>
#1 setosa     <tibble [50 × 4]>
#2 versicolor <tibble [50 × 4]>
#3 virginica  <tibble [50 × 4]>
icol <- 5   # The index of the label column 
df <- data.frame(Label = a[ ,icol], Data = I(lapply(as.data.frame(t(a[, -icol])), c)))
df
#   Label         Data
#V1    17  1, 5, 9, 13
#V2    18 2, 6, 10, 14
#V3    19 3, 7, 11, 15
#V4    20 4, 8, 12, 16
setNames(split(c(t(a[,-(5)])), rep(seq(4), each = 4)), a[,5])

#$`17`
#[1]  1  5  9 13

#$`18`
#[1]  2  6 10 14

#$`19`
#[1]  3  7 11 15

#$`20`
#[1]  4  8 12 16