2012-07-30 35 views
9

bir amino asit yerlerinin bir veri çerçevesi vardır ve bu sitelerin her bir çift kombinasyonun yeni bir veri çerçevesi yaratmak istiyoruz. yani Açıkçası,Veri çerçevesindeki her bir çift sütunu R?

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" 

gerçek veri satır ve/veya sütun yüzlerce olabilir:

orijinal veri bu gibi bir şey olacaktı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" 

Ya ben istiyorum bu Bunu yapmanın daha az manuel bir yoluna ihtiyacım var. Herhangi bir yardım çok takdir edilir, ben mütevazi bir biyologum ve bu alanda yetişen yeteneklerim oldukça sınırlı.

+0

size veri çerçevesi aynı sırada sadece çiftleri istiyor musunuz? Yani, neden ilk sıranızda "fa" veya "ka" değil? –

+0

sayesinde sipariş kimlik açısından önemli değildir, örneğin, "fa" = "af", ama evet çiftleri ancak yenmek örneğin –

cevap

12

combn() ve apply() birleşimi size sırasız ikili kombinasyonların hepsi alacak:

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" 

(yukarıda neler olduğunu hemen belli değil ise, hızlı bir göz atmak isteyebilirsiniz nesne combn(seq_len(ncol(df)), 2) tarafından döndürülen. Onun sütunlar n veri çerçevesinin sütun sayısını ise 1 ile n arasındaki tüm sırasız ikili kombinasyonları tamsayılar numaralandırmak.)

+0

+ 1 Hemen olarak, veri çerçevesi aynı sırada olmalıdır bana bunun için! Benim –

+0

silindi Teşekkür ederim - bu tam olarak ihtiyacım olan şey. Bu soruyu neden beş saat önce göndermedim? Hepiniz harikasınız. –

9

Seniçin FUN argüman kullanabilirsinizher kombinasyon sütunları birbirine yapıştırmak için:

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

+1 Önyüklemek için tatlı ve tatlı bir şekilde gizlenmiş! –

+0

@ JoshO'Brien: Bu konuda ne anlaşılıyor? 'Combn' için' FUN' arg biraz tuhaf gelebilir, ama kombinasyonları bir sürü varsa Bir ara nesnede hepsini saklamak için yok çünkü gerçekten kullanışlı. –

+1

@otherJosh - Obfuscated muhtemelen yanlış bir kelimeydi. 'Kompakt' daha iyi olurdu. Önceden 'alçakgönüllü bir biyolog' olarak kendimi, bu konuyu (ve bu konudaki cevabımın) nasıl ayrıştırılabileceğinin dikkatli olduğunu düşünüyorum. Bilmekte fayda var: JoshO'Brien @ –

2
Josh ve Yuşa cevapları iyidir ama benim yaklaşım vermek düşündü

:

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="")) 
:

Bu gerektirir paste2 işlevini kullanarak qdap varsion 1.1.0 indirirken

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

olsa bu çok daha okunabilir olacaktır yanıtlarına çalmaya

-1

size orijinal data.frame sütunların yüzlerce demek olduğu göz önüne alındığında, yeni data.frame sütunların bir sürü alacak unutmayın: Orijinal veriler daha sonra, yeni n sütun içeriyorsa bir n içerecektir (n-1)/2 sütun -, bu karesel ölçekler.

+3

Bu bir cevap değil; Bu soruyu bir yorum olarak eklemelisiniz. –

+0

Sadece bunu bir yoruma değiştirmeye çalıştım. Ancak, ne kadar az nezaketle, sorulara henüz yorum yapamayacağımı düşünüyorum. Bir başkasının bunu bir yoruma dönüştürmesi mantıklı mı olur, yoksa bu satır spam'a mı yol açar? –

İlgili konular