在 R 中合并数据框的每三列

Mar*_*abi 3 r

我的数据框包含大约 900 列,我想将每 3 列的内容合并到一列中,我尝试做一个循环,但我不擅长,你能帮我吗?
数据框如下所示:

df_out <- data.frame(
  "name" = c("1", "2", "3", "4", "5", "6", "7", "8"),
  "col1"=rep("B",times= 8),
  "col2"=rep("A",times= 8),
  "col3"=rep("G",times= 8),
  "col4"=rep("C",times= 8),
  "col5"=rep("C",times=8),
  "col6"=rep("B",times= 8),
  "col7"=rep("A",times= 8),
  "col8"=rep("G",times= 8),
  "col9"=rep("C",times= 8),
  "col10"=rep("C",times=8),
  "col11"=rep("B",times= 8),
  "col12"=rep("A",times= 8),
  "col13"=rep("G",times= 8),
  "col14"=rep("C",times= 8),
  "col15"=rep("C",times=8)  
)

df_out
Run Code Online (Sandbox Code Playgroud)

所以最终的结果应该是这样的:

df_out2 <- data.frame(
  "name" = c("1", "2", "3", "4", "5", "6", "7", "8"),
  "col1"=rep("BAG",times= 8),
  "col2"=rep("CCB",times= 8),
  "col3"=rep("AGC",times= 8),
  "col4"=rep("CBA",times= 8),
  "col5"=rep("GCC",times=8))

df_out2
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。另外,您能推荐一些学习 R 循环的书籍或好的网站吗?谢谢

lov*_*ery 6

tidyr请使用和库找到以下一种可能的解决方案dplyr。

雷普莱克斯

  • 代码
library(tidyr)
library(dplyr)

cnames <- paste0("col", 1:((ncol(df_out)-1)/3))  
separators <- seq(from = 3, to = (ncol(df_out)-1)-3, by = 3)

df_out %>% 
  select(-name) %>% 
  unite(newCol, names(.), sep = "") %>% 
  separate(newCol, into = cnames, sep = separators) %>% 
  cbind(df_out[1], .)
Run Code Online (Sandbox Code Playgroud)
  • 输出
#>   name col1 col2 col3 col4 col5
#> 1    1  BAG  CCB  AGC  CBA  GCC
#> 2    2  BAG  CCB  AGC  CBA  GCC
#> 3    3  BAG  CCB  AGC  CBA  GCC
#> 4    4  BAG  CCB  AGC  CBA  GCC
#> 5    5  BAG  CCB  AGC  CBA  GCC
#> 6    6  BAG  CCB  AGC  CBA  GCC
#> 7    7  BAG  CCB  AGC  CBA  GCC
#> 8    8  BAG  CCB  AGC  CBA  GCC
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v2.0.1)于 2022 年 2 月 20 日创建