Одним из способов является использование mapply()
над заранее определенным списком столбцов.Сначала вам нужно создать матрицу имен столбцов, как вы это сделали.Вы также можете использовать comb()
, чтобы сделать это:
> df <- data.frame(col2 = c("a", "c", "a"), col3 = c("c", "g", "g"), col4 = c("a", "a", "t"), stringsAsFactors = FALSE)
> nombres <- combn(colnames(df), 2)
> nombres
[,1] [,2] [,3]
[1,] "col2" "col2" "col3"
[2,] "col3" "col4" "col4"
Затем вы создаете два списка векторов:
> lista1 <- lapply(nombres[1,], function(x){
+ df[,x]
+ })
>
> lista2 <- lapply(nombres[2,], function(x){
+ df[,x]
+ })
> lista1
[[1]]
[1] "a" "c" "a"
[[2]]
[1] "a" "c" "a"
[[3]]
[1] "c" "g" "g"
> lista2
[[1]]
[1] "c" "g" "g"
[[2]]
[1] "a" "a" "t"
[[3]]
[1] "a" "a" "t"
Наконец, используйте mapply()
и paste()
два списка:
> mapply(function(x, y){
+ paste(x, y, sep = "")
+ }, x = lista1, y = lista2)
[,1] [,2] [,3]
[1,] "ac" "aa" "ca"
[2,] "cg" "ca" "ga"
[3,] "ag" "at" "gt"
Тогда вы можете cbind
матрицу к исходному фрейму данных:
> df2 <- mapply(function(x, y){
+ paste(x, y, sep = "")
+ }, x = lista1, y = lista2)
>
> colnames(df2) <- paste(nombres[1,], nombres[2,], sep = "")
>
> df_new <- cbind.data.frame(df, df2)
> df_new
col2 col3 col4 col2col3 col2col4 col3col4
1 a c a ac aa ca
2 c g a cg ca ga
3 a g t ag at gt
Надеюсь, это поможет!