我的数据框包含大约 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 循环的书籍或好的网站吗?谢谢
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 日创建