如何在R数据帧中的单个列下嵌套多列对象
假设您有一个矩阵,如: a=矩阵1:20,4,5 其中第1-4列为四维数据点的值,第5列为标签 是否有一种优雅的方法可以使用原生R函数将4-d向量嵌套在一个数据帧的单个列下?从web下载更多专用库的权限受到限制。 基本上,我想以这样的方式结束:如何在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方法是按最后一列进行
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