2011-10-14 39 views
6

tôi có một danh sách lớn, nhưng vi ví dụ sẽ là như sau:Merge hai danh sách thành phần

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) 

sản lượng dự kiến ​​là kết hợp A với B sao cho mỗi thành phần sẽ trông giống như AB

AA, aA, Aa, aa, Aa 

tốt hơn nên được sắp xếp, chữ in hoa luôn là đầu tiên

AA, Aa, Aa, aa, Aa 

danh sách Như vậy mới hoặc ma trận nên có hai cột hoặc hàng:

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

Bây giờ tôi muốn tính toán trung bình của C dựa trên lớp - "AA", "Aa", và "aa"

Trông đơn giản nhưng tôi không thể tìm ra một cách dễ dàng.

Trả lời

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

tôi có thể làm điều đó nếu dữ liệu của bạn được sắp xếp theo một data.frame sử dụng gói 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

Với dữ liệu của bạn:

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

tôi xác định một data.frame sử dụng sự kết hợp của A và B làm cột khóa:

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 

Nếu bạn cần đặt hàng này data.frame trước khi tập hợp sau đó:

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

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

Và với aggregate bạn tính toán giá trị trung bình cho mỗi 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 

Nhưng nếu bạn muốn đặt hàng sau khi tập hợp, sau đó:

df <- data.frame(id=AB, C=C) 
meanDF <- aggregate(C~id, data=df, mean) 
meanDF <- meanDF[order(meanDF$id, decreasing=TRUE),] 
Các vấn đề liên quan