我有一个氨基酸位点的数据框,并希望为这些网站的每个成对组合创建一个新的数据框。
原始数据如下所示:
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"
实际数据可能有数百行和/或列,所以很明显我需要一种不那么简单的手动方式。任何帮助都非常感谢,我只是一个不起眼的生物学家,我在这方面的技能相当有限。
答案 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 列 - 这是按比例缩放的。