2011-10-14 15 views
6

Ho una lista grande, ma micro esempio potrebbe essere come il seguente:unione due Lista componenti

A <- c("A", "a", "A", "a", "A") 
B <- c("A", "A", "a", "a", "a") 
C <- c(1, 2, 3, 1, 4) 
mylist <- list(A=A, B=B, C= C) 

risultato atteso è unione A con B in modo che ogni componente sarà simile AB

AA, aA, Aa, aa, Aa 

meglio dovrebbe essere filtrate, maiuscole è sempre prima

AA, Aa, Aa, aa, Aa 

Così nuovo elenco o matrice devono avere due colonne o Righe:

AA, Aa, Aa, aa, Aa 
1, 2, 3, 1, 4 

Ora voglio calcolare la media di C in base alla classe - "AA", "Aa", e "aa"

sembra semplice, ma non riuscivo a capire facilmente.

risposta

2
> (ab <- paste(A, B, sep="")) 
[1] "AA" "aA" "Aa" "aa" "Aa" 
> (ab <- paste(A, B, sep="")) # the joining step 
[1] "AA" "aA" "Aa" "aa" "Aa" 
> (ab <- sub("([a-z])([A-Z])", "\\2\\1", ab)) # swap lowercase uppercase 
[1] "AA" "Aa" "Aa" "aa" "Aa" 

> rbind(ab, C)     # matrix 
    [,1] [,2] [,3] [,4] [,5] 
ab "AA" "Aa" "Aa" "aa" "Aa" 
C "1" "2" "3" "1" "4" 
> data.frame(alleles=ab, count=C) # dataframes are lists 
    alleles count 
1  AA  1 
2  Aa  2 
3  Aa  3 
4  aa  1 
5  Aa  4 
2

posso farlo se i dati sono disposti in un data.frame utilizzando il pacchetto plyr

> A <- c("A", "a", "A", "a", "A") 
> B <- c("A", "A", "a", "a", "a") 
> C <- c(1, 2, 3, 1, 4) 
> groups <- sort(paste(A, B, sep="")) 
[1] "AA" "aA" "Aa" "aa" "Aa" 
> my.df <- data.frame(A=A, B=B, C=C, group=groups) 

> require(plyr) 
> result <- ddply(my.df, "group", transform, group.means=mean(C)) 
> result[order(result$group, decreasing=TRUE),] 
    A B C group group.means 
5 A A 1 AA   1.0 
3 A a 3 Aa   3.5 
4 A a 4 Aa   3.5 
2 a A 2 aA   2.0 
1 a a 1 aa   1.0 
1

con i tuoi dati:

A <- c("A", "a", "A", "a", "A") 
B <- c("A", "A", "a", "a", "a") 
C <- c(1, 2, 3, 1, 4) 

mi definiscono un data.frame utilizzando la combinazione di A e B come colonna chiave:

AB <- paste(A, B, sep='') 
df <- data.frame(id=AB, C=C) 

> df 
    id C 
1 AA 1 
2 aA 2 
3 Aa 3 
4 aa 1 
5 Aa 4 

Se avete bisogno di ordinare questo data.frame prima dell'aggregazione poi:

df <- df[order(AB, decreasing=TRUE),] 

> df 
    id C 
1 AA 1 
3 Aa 3 
5 Aa 4 
2 aA 2 
4 aa 1 

E con aggregate si calcola la media per ogni id:

meanDF <- aggregate(C~id, data=df, mean) 

> meanDF 

    id C 
1 aa 1.0 
2 aA 2.0 
3 Aa 3.5 
4 AA 1.0 

Ma se volete ordinare dopo l'aggregazione, quindi:

df <- data.frame(id=AB, C=C) 
meanDF <- aggregate(C~id, data=df, mean) 
meanDF <- meanDF[order(meanDF$id, decreasing=TRUE),]