将每对列粘贴在R中的数据框中?

时间:2012-07-30 23:51:56

标签: r

我有一个氨基酸位点的数据框,并希望为这些网站的每个成对组合创建一个新的数据框。

原始数据如下所示:

df<-cbind(letters[1:5], letters[6:10], letters[11:15])
df
 [,1] [,2] [,3] 
[1,] "a"  "f"  "k" 
[2,] "b"  "g"  "l" 
[3,] "c"  "h"  "m" 
[4,] "d"  "i"  "n" 
[5,] "e"  "j"  "o" 

我想要的是这个:

newdf<-cbind(paste(df[,1],df[,2],sep=""),paste(df[,1],df[,3],sep=""),(paste(df[,2],df[,3],sep="")))
newdf
     [,1] [,2] [,3]
[1,] "af" "ak" "fk"
[2,] "bg" "bl" "gl"
[3,] "ch" "cm" "hm"
[4,] "di" "dn" "in"
[5,] "ej" "eo" "jo"

实际数据可能有数百行和/或列,所以很明显我需要一种不那么简单的手动方式。任何帮助都非常感谢,我只是一个不起眼的生物学家,我在这方面的技能相当有限。

4 个答案:

答案 0 :(得分:12)

combn()apply()的组合将为您提供所有无序的成对组合:

df <- cbind(letters[1:5], letters[6:10], letters[11:15])

apply(X = combn(seq_len(ncol(df)), 2), 
      MAR = 2, 
      FUN = function(jj) {
          apply(df[, jj], 1, paste, collapse="")
      }      
)
#      [,1] [,2] [,3]
# [1,] "af" "ak" "fk"
# [2,] "bg" "bl" "gl"
# [3,] "ch" "cm" "hm"
# [4,] "di" "dn" "in"
# [5,] "ej" "eo" "jo"

(如果上面的内容没有立即清楚,你可能希望快速查看combn(seq_len(ncol(df)), 2)返回的对象。它的列枚举1和{{1}之间的所有无序成对组合整数。其中n是数据框中的列数。)

答案 1 :(得分:9)

您可以使用FUN combn参数将每个组合的列粘贴在一起:

combn(ncol(df),2,FUN=function(i) apply(df[,i],1,paste0,collapse=""))

答案 2 :(得分:2)

乔什和约书亚的答案更好但我认为我会给出我的方法:

这需要使用paste2函数下载qdap varsion 1.1.0

library(qdap)

ind <- unique(t(apply(expand.grid(1:3, 1:3), 1, sort)))
ind <- ind[ind[, 1] != ind[, 2], ]
sapply(1:nrow(ind), function(i) paste2(df[, unlist(ind[i, ])], sep=""))

虽然要从他们的答案中窃取,但这会更具可读性:

ind <- t(combn(seq_len(ncol(df)), 2))
sapply(1:nrow(ind), function(i) paste2(df[, unlist(ind[i, ])], sep=""))

答案 3 :(得分:-1)

请记住,如果您说原始data.frame中有数百列,那么您将在新的data.frame中获得 lot 列:如果原始数据包含 n 列,然后新的列将包含 n(n-1)/ 2 列 - 这是按比例缩放的。