2013-05-07 40 views
8

Có cách dễ dàng để thêm số lượng cho mỗi danh mục trong hai bảng lớn trong R không?Cách dễ dàng để "thêm" hai bảng lớn vào R?

... nơi các bảng làm không phải tất cả có chính xác cùng các giá trị hiện tại (mặc dù họ sẽ khá nhiều điểm trùng):

ví dụ nhỏ về những gì tôi đang cố gắng làm. Thiết lập một số dữ liệu:

x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
    x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

    table(x1) 
x1 
2 3 4 5 6 8 9 11 
2 5 2 5 1 3 1 1 

table(x2) 
x2 
5 6 7 8 9 10 11 12 14 17 
2 2 3 1 1 1 2 1 1 1 

Bây giờ tôi muốn kết hợp các bảng như thể tôi đã làm table(c(x1,x2)), nhận được:

2 3 4 5 6 7 8 9 10 11 12 14 17 
2 5 2 7 3 3 4 2 1 3 1 1 1 

Nhưng bây giờ tưởng tượng x1 và x2 không còn nữa (và thực sự lớn vì vậy tôi thực sự không muốn tạo lại chúng từ các bảng và thực sự làm table(c(x1,x2))), tất cả những gì tôi muốn là lấy các bảng t1t2 và thêm số lượng (thường rất lớn) ... mà tôi có thể thực hiện có thật không những cách vụng về.

Tuy nhiên, điều này có vẻ như nó phải được cả hai rất phổ biến và rất dễ dàng-giải quyết vấn đề (thực sự, tôi nghĩ rằng t1 + t2 nên làm việc cho các bảng với các hạng mục cùng loại) nhưng tìm kiếm các câu hỏi về tất cả các thuật ngữ tìm kiếm Tôi có thể nghĩ rằng không tìm thấy gì.

Tôi đã bỏ lỡ một cách thực sự đơn giản và rõ ràng để làm điều này?

Edit:

Để làm rõ, một cái gì đó như thế này (mà tôi đã làm) không phải là 'đơn giản và rõ ràng' cho những gì phải là một hoạt động rất phổ biến với các bảng:

m <- merge(t1,t2,by.x="x1",by.y="x2",all=TRUE) 
m[is.na(m)] <- 0 
oo <- order(m$x1) 
t12 <- m[oo,2]+m[oo,3] 
names(t12) <- m[oo,1] 

Đặc biệt này thực sự là không đơn giản và dễ làm theo hơn là phương pháp tiếp cận vũ lực.

+0

Bạn nên có một cái nhìn tại ' hợp nhất'. –

+0

@PaulHiemstra Tôi đã làm, trước khi đăng. Tôi cũng chơi với nó trong một thời gian dài. Tôi đã không thấy một cách tốt để làm những gì tôi muốn (dễ dàng hơn là làm nó bằng vũ lực). Có thể tôi đã bỏ lỡ thứ gì đó ở đó, nhưng trong trường hợp đó ... tôi cần nhiều gợi ý hơn thế. –

+1

Cuộc sống của bạn sẽ dễ dàng hơn nhiều nếu bạn sử dụng khung dữ liệu thay vì bảng. Các bảng chỉ được đặt tên là các vectơ, và nói chung, có một vài hàm R để căn chỉnh và kết hợp các vectơ có tên, và nhiều cho các khung dữ liệu. – hadley

Trả lời

8

Một cách khác để sử dụng tapply:

tapply(c(t1,t2), names(c(t1,t2)), sum) 
# 10 11 12 14 17 2 3 4 5 6 7 8 9 
# 1 3 1 1 1 2 5 2 7 3 3 4 2 

Dưới đây là nếu bạn muốn có một sản lượng được sắp xếp:

w <- c(t1,t2) 
# edit: Following G.Grothendieck's suggestion to simplify it further 
tapply(w, as.numeric(names(w)), sum) 
# 2 3 4 5 6 7 8 9 10 11 12 14 17 
# 2 5 2 7 3 3 4 2 1 3 1 1 1 
+0

+1 ý tưởng tuyệt vời, đang tìm kiếm nội dung như thế này. – juba

+0

Ah, gọn gàng. Có, sắp xếp đầu ra là cần thiết. Đó là cách thứ hai sẽ mở rộng độc đáo cho nhiều bảng với ít nỗ lực. –

1

Như @PaulHiemstra đã nói, merge nên thực hiện công việc. Tôi không quá quen thuộc với nó, nhưng mã này nên làm việc (mặc dù có thể có một cách hiệu quả hơn để làm điều đó ...)

x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

tx1 <- table(x1) 
tx2 <- table(x2) 

df1 <- data.frame(names=names(tx1),values=as.vector(tx1)) 
df2 <- data.frame(names=names(tx2),values=as.vector(tx2)) 

mdf12 <- merge(df1,df2,by="names",all=TRUE) 
mdf12[is.na(mdf12)] <- 0 

counts <- mdf12[,2] + mdf12[,3] 
names(counts) <- mdf12[,1] 

counts[order(as.numeric(names(counts)))] 
table(c(x1,x2)) 

tôi không thích bước is.na, nhưng tôi không biết làm thế nào để làm cho nó, có 0 ở nơi đầu tiên thay vì NA.

+0

Cảm ơn, vâng, tôi thực sự đã làm một cái gì đó khá gần với điều này, nhưng nó có vẻ phức tạp ridiculously cho những gì phải là một hoạt động rất thường xuyên với bảng. –

+0

Được rồi, xin lỗi sau đó để mang lại điều đó. Có lẽ tôi có thể xóa bài đăng này sau, khi bạn đã chỉnh sửa bài đăng của mình mà bạn đã thử giải pháp phức tạp đó trước đây và @Arun đã đăng một giải pháp phù hợp (+1). –

+0

Lỗi ở đây là của tôi; câu trả lời của bạn bao gồm * a * cách để làm điều đó và trong trường hợp không có thông tin sau này tôi đưa vào chỉnh sửa là một câu trả lời hợp lý. Tôi đã upvoted cho phù hợp. –

0

Trong dplyr:

library(dplyr) 
x1 <- c(5, 3, 3, 6, 3, 3, 5, 5, 11, 2, 4, 9, 3, 5, 8, 2, 8, 5, 4, 8) 
x2 <- c(6, 10, 9, 17, 6, 7, 8, 11, 5, 12, 14, 5, 11, 7, 7) 

# Transform "Tables" to DataFrames & standardize column names 
df1 <- as.data.frame(table(x1)) %>% select(x = x1, Freq) 
df2 <- as.data.frame(table(x2)) %>% select(x = x2, Freq) 

# Merge tables & aggregate results 
Ttldf <- bind_rows(df1, df2) %>% group_by(x) %>% summarise(TtlFreq = sum(Freq)) 

Đối với một tốt, súc tích int Phiên bản phần cứng để tóm tắt và đường ống Vignette là một nguồn lực lớn: https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

Để biết thêm thông tin về cách để nhanh chóng sử dụng tổng hợp để tiếp tục tác động tốt nhất, hướng dẫn Markham là rất hữu ích: https://rpubs.com/justmarkham/dplyr-tutorial

Các vấn đề liên quan