2011-09-16 24 views
20

Tôi đang cố gắng tạo bảng dự phòng từ một loại dữ liệu cụ thể. Điều này sẽ có thể thực hiện được với các vòng lặp ... nhưng vì bảng cuối cùng của tôi sẽ chứa nhiều hơn 10E5 ô, tôi đang tìm một hàm có sẵn.Làm cách nào để có bảng dự phòng?

dữ liệu ban đầu của tôi là như sau:

PLANT     ANIMAL       INTERACTIONS 
---------------------- ------------------------------- ------------ 
Tragopogon_pratensis Propylea_quatuordecimpunctata   1 
Anthriscus_sylvestris Rhagonycha_nigriventris    3 
Anthriscus_sylvestris Sarcophaga_carnaria     2 
Heracleum_sphondylium Sarcophaga_carnaria     1 
Anthriscus_sylvestris Sarcophaga_variegata     4 
Anthriscus_sylvestris Sphaerophoria_interrupta_Gruppe  3 
Cerastium_holosteoides Sphaerophoria_interrupta_Gruppe  1 

Tôi muốn tạo ra một bảng như thế này:

     Propylea_quatuordecimpunctata Rhagonycha_nigriventris Sarcophaga_carnaria Sarcophaga_variegata Sphaerophoria_interrupta_Gruppe 
---------------------- ----------------------------- ----------------------- ------------------- -------------------- ------------------------------- 
Tragopogon_pratensis 1        0      0     0     0 
Anthriscus_sylvestris 0        3      2     4     3 
Heracleum_sphondylium 0        0      1     0     0 
Cerastium_holosteoides 0        0      0     0     1 

Đó là, tất cả các loài thực vật trong hàng, tất cả các loài động vật trong các cột, và đôi khi không có tương tác (trong khi dữ liệu ban đầu của tôi chỉ liệt kê các tương tác xảy ra).

+2

tế bào 10E5 trong một bảng bất ngờ !!! Bạn đang phân tích những gì? Nếu bạn đang kiểm tra tương tác bằng cách sử dụng chi square, bạn cần có ít nhất 5 quan sát trong mỗi ô. – Ramnath

Trả lời

30

Trong cơ sở R, sử dụng table hay xtabs:

with(warpbreaks, table(wool, tension)) 

    tension 
wool L M H 
    A 9 9 9 
    B 9 9 9 

xtabs(~wool+tension, data=warpbreaks) 

    tension 
wool L M H 
    A 9 9 9 
    B 9 9 9 

Các gmodels gói có một chức năng CrossTable cung cấp cho đầu ra tương tự như những gì người sử dụng SPSS hoặc SAS hy vọng:

library(gmodels) 
with(warpbreaks, CrossTable(wool, tension)) 


    Cell Contents 
|-------------------------| 
|      N | 
| Chi-square contribution | 
|   N/Row Total | 
|   N/Col Total | 
|   N/Table Total | 
|-------------------------| 


Total Observations in Table: 54 


      | tension 
     wool |   L |   M |   H | Row Total | 
-------------|-----------|-----------|-----------|-----------| 
      A |   9 |   9 |   9 |  27 | 
      |  0.000 |  0.000 |  0.000 |   | 
      |  0.333 |  0.333 |  0.333 |  0.500 | 
      |  0.500 |  0.500 |  0.500 |   | 
      |  0.167 |  0.167 |  0.167 |   | 
-------------|-----------|-----------|-----------|-----------| 
      B |   9 |   9 |   9 |  27 | 
      |  0.000 |  0.000 |  0.000 |   | 
      |  0.333 |  0.333 |  0.333 |  0.500 | 
      |  0.500 |  0.500 |  0.500 |   | 
      |  0.167 |  0.167 |  0.167 |   | 
-------------|-----------|-----------|-----------|-----------| 
Column Total |  18 |  18 |  18 |  54 | 
      |  0.333 |  0.333 |  0.333 |   | 
-------------|-----------|-----------|-----------|-----------| 
+0

Bạn có thể giải thích những con số đó với số thập phân có ý nghĩa gì không? Tôi đã sử dụng gmodels để tạo một bảng dự phòng và đối số duy nhất tôi đặt thành TRUE là prop.c (tức là mọi thứ khác được đặt thành FALSE).Tôi vẫn nhận được một số phụ được hiển thị cùng với tỷ lệ phần trăm cột và giá trị n thực tế cho ô ... và tôi không thể cho cuộc sống của tôi tìm ra nó là gì (và có, tôi đã tìm kiếm rất nhiều làm thế nào để giải thích đầu ra!). Cảm ơn. – AHegde

+2

Câu trả lời của bạn nằm ở đầu ra ở trên. Ở đầu đầu ra là một hộp có tên là 'Nội dung ô'. Nó giải thích ý nghĩa của từng số, tức là các phân số chi tiết và hàng và cột khác nhau. – Andrie

9

gói reshape nên làm các trick.

> library(reshape) 

> df <- data.frame(PLANT = c("Tragopogon_pratensis","Anthriscus_sylvestris","Anthriscus_sylvestris","Heracleum_sphondylium","Anthriscus_sylvestris","Anthriscus_sylvestris","Cerastium_holosteoides"), 
        ANIMAL= c("Propylea_quatuordecimpunctata","Rhagonycha_nigriventris","Sarcophaga_carnaria","Sarcophaga_carnaria","Sarcophaga_variegata","Sphaerophoria_interrupta_Gruppe","Sphaerophoria_interrupta_Gruppe"), 
        INTERACTIONS = c(1,3,2,1,4,3,1), 
        stringsAsFactors=FALSE) 

> df <- melt(df,id.vars=c("PLANT","ANIMAL"))  
> df <- cast(df,formula=PLANT~ANIMAL) 
> df <- replace(df,is.na(df),0) 

> df 
        PLANT Propylea_quatuordecimpunctata Rhagonycha_nigriventris 
1 Anthriscus_sylvestris        0      3 
2 Cerastium_holosteoides        0      0 
3 Heracleum_sphondylium        0      0 
4 Tragopogon_pratensis        1      0 
    Sarcophaga_carnaria Sarcophaga_variegata Sphaerophoria_interrupta_Gruppe 
1     2     4        3 
2     0     0        1 
3     1     0        0 
4     0     0        0 

Tôi vẫn đang tìm cách khắc phục sự cố order, bất kỳ đề xuất nào?

+1

Bạn có thể thay thế ba dòng cuối cùng chỉ bằng một lệnh: đúc (PLANT ~ ANIMAL, dữ liệu = df, giá trị = "TƯƠNG TÁC", điền = 0) – Thierry

+0

Nếu bạn muốn đặt hàng kết quả đó trên cơ sở của lệnh đặt dataframe đầu vào , bạn có thể sử dụng 'order (unique (df $ PLANT))' trên các hàng và tương tự rõ ràng trên các cột. Ví dụ của bạn không cần 'unique' nhưng phiên bản có nhiều mục nhập cho mỗi cặp có giá trị được tổng hợp có thể cần. –

5

xtabs trong cơ sở R nên làm việc, ví dụ:

dat <- data.frame(PLANT = c("p1", "p2", "p2", "p4", "p5", "p5", "p6"), 
        ANIMAL = c("a1", "a2", "a3", "a3", "a4", "a5", "a5"), 
        INTERACTIONS = c(1,3,2,1,4,3,1), 
        stringsAsFactors = FALSE) 

(x2.table <- xtabs(dat$INTERACTIONS ~ dat$PLANT + dat$ANIMAL)) 

    dat$ANIMAL 
dat$PLANT a1 a2 a3 a4 a5 
     p1 1 0 0 0 0 
     p2 0 3 2 0 0 
     p4 0 0 1 0 0 
     p5 0 0 0 4 3 
     p6 0 0 0 0 1 

chisq.test(x2.table, simulate.p.value = TRUE) 

Tôi nghĩ rằng nên làm những gì bạn đang tìm kiếm khá dễ dàng. Tôi không chắc làm thế nào nó tăng quy mô về hiệu quả cho một bảng dự phòng 10E5, nhưng đó có thể là một vấn đề riêng biệt thống kê.

8

tôi muốn chỉ ra rằng chúng ta có thể nhận được kết quả tương tự Andrie gửi mà không cần sử dụng chức năng with:

R Cơ sở Gói

# 3 options 
table(warpbreaks[, 2:3]) 
table(warpbreaks[, c("wool", "tension")]) 
table(warpbreaks$wool, warpbreaks$tension, dnn = c("wool", "tension")) 

    tension 
wool L M H 
    A 9 9 9 
    B 9 9 9 

gmodels gói:

library(gmodels) 
# 2 options  
CrossTable(warpbreaks$wool, warpbreaks$tension) 
CrossTable(warpbreaks$wool, warpbreaks$tension, dnn = c("Wool", "Tension")) 


    Cell Contents 
|-------------------------| 
|      N | 
| Chi-square contribution | 
|   N/Row Total | 
|   N/Col Total | 
|   N/Table Total | 
|-------------------------| 


Total Observations in Table: 54 


       | warpbreaks$tension 
warpbreaks$wool |   L |   M |   H | Row Total | 
----------------|-----------|-----------|-----------|-----------| 
       A |   9 |   9 |   9 |  27 | 
       |  0.000 |  0.000 |  0.000 |   | 
       |  0.333 |  0.333 |  0.333 |  0.500 | 
       |  0.500 |  0.500 |  0.500 |   | 
       |  0.167 |  0.167 |  0.167 |   | 
----------------|-----------|-----------|-----------|-----------| 
       B |   9 |   9 |   9 |  27 | 
       |  0.000 |  0.000 |  0.000 |   | 
       |  0.333 |  0.333 |  0.333 |  0.500 | 
       |  0.500 |  0.500 |  0.500 |   | 
       |  0.167 |  0.167 |  0.167 |   | 
----------------|-----------|-----------|-----------|-----------| 
    Column Total |  18 |  18 |  18 |  54 | 
       |  0.333 |  0.333 |  0.333 |   | 
----------------|-----------|-----------|-----------|-----------| 
2

Chỉ cần sử dụng chức năng dcast() của gói "reshape2":

ans = dcast(df, PLANT~ ANIMAL,value.var = "INTERACTIONS", fill = 0) 

Ở đây "PLANT" sẽ ở cột bên trái, "ANIMALS" trên hàng trên cùng, điền bảng sẽ xảy ra bằng cách sử dụng "TƯƠNG TÁC" và "NULL" sẽ được điền bằng 0.

0

Với dplyr/tidyr:

df <- read.table(text='PLANT     ANIMAL       INTERACTIONS 
       Tragopogon_pratensis Propylea_quatuordecimpunctata   1 
       Anthriscus_sylvestris Rhagonycha_nigriventris    3 
       Anthriscus_sylvestris Sarcophaga_carnaria     2 
       Heracleum_sphondylium Sarcophaga_carnaria     1 
       Anthriscus_sylvestris Sarcophaga_variegata     4 
       Anthriscus_sylvestris Sphaerophoria_interrupta_Gruppe  3 
       Cerastium_holosteoides Sphaerophoria_interrupta_Gruppe  1', header=TRUE) 
library(dplyr) 
library(tidyr) 
df %>% spread(ANIMAL, INTERACTIONS, fill=0) 

#     PLANT Propylea_quatuordecimpunctata Rhagonycha_nigriventris Sarcophaga_carnaria Sarcophaga_variegata Sphaerophoria_interrupta_Gruppe 
# 1 Anthriscus_sylvestris        0      3     2     4        3 
# 2 Cerastium_holosteoides        0      0     0     0        1 
# 3 Heracleum_sphondylium        0      0     1     0        0 
# 4 Tragopogon_pratensis        1      0     0     0        0 
Các vấn đề liên quan