我有一个很大的数据帧,我想从各个列创建几个新的数据帧.每个新的数据帧应该由前两列加上后面的一列组成.

我可以手动完成此操作;我想要的虚拟产品是subAsubBsubC.

library(tidyverse)

# dummy dataframe
chr1 <- letters[1:4]
chr2 <- letters[23:26]
A <- 1:4
B <- 5:8
C <- 9:12
data <- tibble(chr1, chr2, A, B, C)

# manual subsetting
subA <- data %>%
  select(chr1, chr2, A)

subB <- data %>%
  select(chr1, chr2, B)

subC <- data %>%
  select(chr1, chr2, C)

但是,我的原始dataframe大约有700列,所以我正在寻找某种简单的迭代,最好是tidyVerse(Purrr),它足够灵活,可以通过管道补充到其他函数中.

推荐答案

base年中:

lapply(split.default(data[-c(1,2)], names(data[-c(1,2)])), function(x) 
        cbind(data[c(1,2)], x))

tidyverse分:

data %>% 
  pivot_longer(-c(1, 2)) %>% 
  split(., .$name) %>% 
  map(., ~pivot_wider(.x))
#> $A
#> # A tibble: 4 x 3
#>   chr1  chr2      A
#>   <chr> <chr> <int>
#> 1 a     w         1
#> 2 b     x         2
#> 3 c     y         3
#> 4 d     z         4
#> 
#> $B
#> # A tibble: 4 x 3
#>   chr1  chr2      B
#>   <chr> <chr> <int>
#> 1 a     w         5
#> 2 b     x         6
#> 3 c     y         7
#> 4 d     z         8
#> 
#> $C
#> # A tibble: 4 x 3
#>   chr1  chr2      C
#>   <chr> <chr> <int>
#> 1 a     w         9
#> 2 b     x        10
#> 3 c     y        11
#> 4 d     z        12

如果要将这些数据帧保存为单独的数据帧:

list2env(
    lapply(split.default(data[-c(1,2)], paste0("sub", names(data[-c(1,2)]))), function(x) 
           cbind(data[c(1,2)], x)),  
    envir=.GlobalEnv)

创建于2024-01-16年第reprex v2.0.2

R相关问答推荐

保存包含循环和ifelse的函数的输出

查找图下的面积

矩阵%*%矩阵中的错误:需要数字/复杂矩阵/向量参数

将年度数据插入月度数据

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

通过在colname中查找其相应值来创建列

Select 季度月值

绘制采样开始和采样结束之间的事件

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

在R中创建连续的期间

如何移除GGPlot中超出与面相交的任何格网像元

为什么在写入CSV文件时Purrr::Pwalk不起作用

将统计检验添加到GGPUBR中的盒图,在R

如何在条形图中的x和填充变量中包含多个响应变量?

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

是否从列中删除★符号?

如何在R中创建这些列?

如何在shiny 的应用程序 map 视图宣传单中可视化单点

如何在矩阵图中按标准对数据进行分组以绘制矩阵

当y为负值时,无法使stat_cor正确定位到底部?