2011-07-12 49 views
12

Tôi đang viết báo cáo yêu cầu tạo một số bảng tổng hợp trong Excel. Tôi muốn nghĩ rằng có một cách để làm điều này trong R để tôi có thể tránh Excel. Tôi muốn đầu ra như ảnh chụp màn hình dưới đây (tên giáo viên được redacted). Theo như tôi có thể nói, tôi có thể sử dụng gói định hình lại để tính toán các giá trị tổng hợp, nhưng tôi cần phải làm điều đó một số lần và bằng cách nào đó có được tất cả dữ liệu theo đúng thứ tự. Tại thời điểm đó, tôi chỉ nên làm điều đó trong Excel. Có ai có bất cứ đề nghị hoặc gói khuyến nghị? Cảm ơn bạn!Đầu ra giống Bảng Pivot trong R?

(EDIT) Dữ liệu bắt đầu dưới dạng danh sách sinh viên, giáo viên, trường học và tăng trưởng của họ. Dữ liệu này sau đó được tổng hợp để có được danh sách các giáo viên có mức tăng trưởng trung bình. Xin lưu ý các giáo viên sau đó được nhóm theo trường. Vấn đề lớn nhất tôi thấy trước khi làm điều này với R là bây giờ là làm thế nào để bạn nhận được tổng số và tổng số hàng (BSA1 Total, Grand Total, vv) trong đó vì họ không phải là cùng một loại quan sát như những người khác? Bạn chỉ cần tự tính toán chúng và cố gắng để có được chúng theo thứ tự đúng để chúng xuất hiện ở dưới cùng của nhóm đó?

example

+0

Câu hỏi như nó đứng tại là quá mơ hồ để được giải đáp một cách hợp lý trên trang web ở đây theo ý kiến ​​của tôi. Tôi chỉ có thể nói: học latex nếu bạn không biết điều đó, hãy xem câu hỏi này: http://stackoverflow.com/questions/5465314/tools-for-making-latex-tables-in-r và lấy khung dữ liệu ở định dạng đúng bằng cách sử dụng ví dụ 'plyr' hoặc' reshape' hoặc các hàm cơ sở như 'cast' v.v. Bắt đầu ra bạn có khá dễ dàng trong R, nhưng bạn sẽ nhận được nó ở định dạng văn bản. Bố trí nên được thực hiện ở nơi khác. –

+0

Bạn nên xem xét R Data Frames. – ATMathew

+1

Chắc chắn có một số cách dễ dàng để thực hiện điều này trong R nhưng sẽ tốt hơn nếu bạn có thể cung cấp dữ liệu nào bắt đầu ngoài kết quả bạn muốn bạn sẽ nhận được mã tốt hơn và phù hợp hơn. – John

Trả lời

19

Dưới đây là một swag tại các bit tính:

set.seed(1) 
school <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T) 
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T) 
growth <- rnorm(100, 5, 3) 

myDf <- data.frame(school, teacher, growth) 

require(reshape2) 

aggregate(growth ~ school + teacher, data =myDf, FUN=mean) 

myDf.melt <- melt(myDf, measured="growth") 
dcast(myDf.melt, school + teacher ~ ., fun.aggregate=mean, margins=c("school", "teacher")) 

Tôi đã không được giải quyết định dạng đầu ra, chỉ tính. Khung dữ liệu kết quả sẽ trông giống như sau:

school teacher  NA 
1 BSA1 Dick 4.663140 
2 BSA1 Harry 4.310802 
3 BSA1  Tom 5.505247 
4 BSA1 (all) 4.670451 
5 BSA2 Dick 6.110988 
6 BSA2 Harry 5.007221 
7 BSA2  Tom 4.337063 
8 BSA2 (all) 5.196018 
9 HSA1 Dick 4.508610 
10 HSA1 Harry 4.890741 
11 HSA1  Tom 4.721124 
12 HSA1 (all) 4.717335 
13 (all) (all) 4.886576 

Ví dụ đó sử dụng gói định hình lại để xử lý tổng phụ.

Tôi nghĩ R là công cụ phù hợp cho công việc tại đây. Tôi hoàn toàn có thể hiểu không chắc chắn làm thế nào để bắt đầu phân tích này. Tôi đã đến R từ Excel một vài năm trước và nó có thể được khó khăn để grok lúc đầu tiên. Hãy để tôi chỉ ra bốn mẹo chuyên nghiệp để giúp bạn nhận được câu trả lời tốt hơn trong Stack Overflow:

1) cung cấp dữ liệu, ngay cả khi được mô phỏng: bạn có thể thấy tôi mô phỏng một số dữ liệu ở đầu câu trả lời của mình. Nếu bạn đã cung cấp mô phỏng nó sẽ có một) tiết kiệm thời gian cho tôi b) đã cho bạn một câu trả lời đã sử dụng cấu trúc dữ liệu của riêng bạn, không phải là một trong tôi mơ ước và c) những người khác sẽ trả lời. Tôi thường bỏ qua các câu hỏi không có dữ liệu bởi vì tôi đã mệt mỏi vì đoán về dữ liệu mà họ được kể câu trả lời của tôi bị hút bởi vì tôi đoán sai.

2) Đặt một câu hỏi rõ ràng. "Làm thế nào để làm công việc của tôi" không phải là một câu hỏi rõ ràng. "Làm cách nào để lấy dữ liệu ví dụ này và tạo tổng phụ trong tổng hợp như đầu ra ví dụ này" là một câu hỏi cụ thể.

3) tiếp tục yêu cầu! Tất cả chúng ta trở nên tốt hơn với thực hành. Bạn đang cố gắng làm nhiều hơn trong R và ít hơn trong Excel, do đó bạn rõ ràng về tình báo trung bình trên. Tiếp tục sử dụng R và tiếp tục đặt câu hỏi. Tất cả sẽ dễ dàng hơn trong thời gian.

4) Hãy cẩn thận với các từ của bạn khi bạn mô tả mọi thứ. Bạn nói trong câu hỏi đã chỉnh sửa của bạn, bạn có một "danh sách" của sự vật. Một danh sách trong R là một cấu trúc dữ liệu cụ thể. Tôi nghi ngờ bạn thực sự có một khung dữ liệu và đang sử dụng thuật ngữ "danh sách" theo nghĩa chung. Điều này có thể làm cho một số nhầm lẫn. Nó cũng minh họa tại sao bạn muốn cung cấp dữ liệu của riêng bạn.

+1

Cảm ơn bạn! Câu trả lời cực kỳ hữu ích. –

+2

Nếu bạn định dạng địa chỉ, bạn có nên sử dụng xtable và Sweave không? Hoặc cái gì khác bạn đề nghị? Cám ơn bạn một lần nữa. –

10

Sử dụng dữ liệu mô phỏng JD Long, và thêm các sd và đếm:

library(reshape) # not reshape2 
    cast(myDf.melt, school + teacher ~ ., margins=TRUE , c(mean, sd, length)) 
    school teacher  mean  sd length 
1 BSA1 Dick 4.663140 3.718773  14 
2 BSA1 Harry 4.310802 1.430594  9 
3 BSA1  Tom 5.505247 4.045846  4 
4 BSA1 (all) 4.670451 3.095980  27 
5 BSA2 Dick 6.110988 2.304104  15 
6 BSA2 Harry 5.007221 2.908146  9 
7 BSA2  Tom 4.337063 2.789244  14 
8 BSA2 (all) 5.196018 2.682924  38 
9 HSA1 Dick 4.508610 2.946961  11 
10 HSA1 Harry 4.890741 2.977305  13 
11 HSA1  Tom 4.721124 3.193576  11 
12 HSA1 (all) 4.717335 2.950959  35 
13 (all) (all) 4.886576 2.873637 100 
+0

Minh họa tốt. Tôi đã lười biếng và chỉ làm có nghĩa là :) –

+0

Tôi nghĩ rằng nó nên được dễ dàng với dcast :: reshape2 nhưng không thể làm cho nó hoạt động được, vì vậy tôi quay trở lại để cast :: reshape. –

+0

oh ... thú vị. Tôi không thể làm điều đó trong reshape2. –

1

Dưới đây là nhiều cách khác nhau tạo ra này bằng cách sử dụng gói pivottabler tương đối mới.

Tiết lộ: Tôi là tác giả của gói.

Để biết thêm thông tin, hãy xem trang gói trên CRAN và các họa tiết gói khác nhau có sẵn trên trang đó.

mẫu dữ liệu (tương tự như trên)

set.seed(1) 
school <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T) 
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T) 
growth <- rnorm(100, 5, 3) 
myDf <- data.frame(school, teacher, growth) 

nhanh sản lượng pivot table để an ủi dưới dạng văn bản thuần

library(pivottabler) 
# arguments: qhpvt(dataFrame, rows, columns, calculations, ...) 
qpvt(myDf, c("school", "teacher"), NULL, 
    c("Average Growth"="mean(growth)", "Std Dev"="sd(growth)", 
     "# of Scholars"="n()"), 
    formats=list("%.1f", "%.1f", "%.0f")) 

điều khiển Output:

   Average Growth Std Dev # of Scholars 
BSA1 Dick    4.7  3.7    14 
     Harry    4.3  1.4    9 
     Tom    5.5  4.0    4 
     Total    4.7  3.1    27 
BSA2 Dick    6.1  2.3    15 
     Harry    5.0  2.9    9 
     Tom    4.3  2.8    14 
     Total    5.2  2.7    38 
HSA1 Dick    4.5  2.9    11 
     Harry    4.9  3.0    13 
     Tom    4.7  3.2    11 
     Total    4.7  3.0    35 
Total     4.9  2.9   100 

nhanh ra bảng pivot như một widget html

library(pivottabler) 
qhpvt(myDf, c("school", "teacher"), NULL, 
    c("Average Growth"="mean(growth)", "Std Dev"="sd(growth)", 
     "# of Scholars"="n()"), 
    formats=list("%.1f", "%.1f", "%.0f")) 

HTML Widget Output:

enter image description here

Tạo bảng pivot sử dụng cú pháp tiết hơn

này có nhiều lựa chọn hơn, ví dụ đổi tên tổng số.

library(pivottabler) 
pt <- PivotTable$new() 
pt$addData(myDf) 
pt$addRowDataGroups("school", totalCaption="(all)") 
pt$addRowDataGroups("teacher", totalCaption="(all)") 
pt$defineCalculation(calculationName="c1", caption="Average Growth", 
    summariseExpression="mean(growth)", format="%.1f") 
pt$defineCalculation(calculationName="c2", caption="Std Dev", 
    summariseExpression="sd(growth)", format="%.1f") 
pt$defineCalculation(calculationName="c3", caption="# of Scholars", 
    summariseExpression="n()", format="%.0f") 
pt # to output to console as plain text 
pt$renderPivot() # to output as a html widget 

HTML Widget Output:

enter image description here

0

Xin lỗi vì autopromotion nhưng hãy nhìn vào gói của tôi expss.

Mã để tạo đầu ra dưới đây:

set.seed(1) 
school <- sample(c("BSA1", "BSA2", "HSA1"), 100, replace=T) 
teacher <- sample(c("Tom", "Dick", "Harry"), 100, replace=T) 
growth <- rnorm(100, 5, 3) 

myDf <- data.frame(school, teacher, growth) 

library(expss) 
myDf %>% 
    # 'tab_cells' - variables on which statistics will be calculated 
    # "|" is needed to suppress 'growth' in row labels 
    tab_cells("|" = growth) %>% 
    # 'tab_cols' - variables for columns. Can be ommited 
    tab_cols(total(label = "")) %>% 
    # 'tab_rows' - variables for rows. 
    tab_rows(school %nest% list(teacher, "(All)"), "|" = "(All)") %>% 
    # 'method = list' is needed for statistics labels in column 
    tab_stat_fun("Average Growth" = mean, 
       "Std Dev" = sd, 
       "# of scholars" = length, 
       method = list) %>% 
    # finalize table 
    tab_pivot() 

Mã trên cho đối tượng kế thừa từ data.frame có thể được sử dụng với các hoạt động R tiêu chuẩn (Subsetting với [ và vv). Nhưng có một phương pháp đặc biệt print cho đối tượng này. sản lượng Console:

|  |  | Average Growth | Std Dev | # of scholars | 
| ----- | ----- | -------------- | ------- | ------------- | 
| BSA1 | Dick |   4.7 |  3.7 |   14 | 
|  | Harry |   4.3 |  1.4 |    9 | 
|  | Tom |   5.5 |  4.0 |    4 | 
|  | (All) |   4.7 |  3.1 |   27 | 
| BSA2 | Dick |   6.1 |  2.3 |   15 | 
|  | Harry |   5.0 |  2.9 |    9 | 
|  | Tom |   4.3 |  2.8 |   14 | 
|  | (All) |   5.2 |  2.7 |   38 | 
| HSA1 | Dick |   4.5 |  2.9 |   11 | 
|  | Harry |   4.9 |  3.0 |   13 | 
|  | Tom |   4.7 |  3.2 |   11 | 
|  | (All) |   4.7 |  3.0 |   35 | 
| (All) |  |   4.9 |  2.9 |   100 | 

Output qua htmlTable trong knitr, xem RStudio hoặc Shiny:

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