Tôi là một người dùng R cuồng nhiệt và hiếm khi sử dụng bất kỳ thứ gì khác để phân tích và trực quan hóa dữ liệu. Nhưng trong khi R là lựa chọn của tôi, trong một số trường hợp,
Đó là lý do tại sao tôi muốn xem R và Python hoạt động như thế nào khi so sánh trực tiếp một phân tích đại diện cho những gì tôi thường làm việc với
kết luận
Nói chung, mã Python có thể dễ dàng được dịch sang R và có thể so sánh về độ dài và tính đơn giản giữa hai ngôn ngữ. Mặc dù cú pháp của Python vốn đã sạch hơn/gọn gàng hơn, nhưng chúng ta có thể sử dụng các gói triển khai đường ống trong R và đạt được kết quả tương tự [mặc dù cú pháp được phân tách bằng dấu chấm của Python vẫn dễ gõ hơn nhiều so với sử dụng toán tử đường ống của magrittr]. Đối với vẽ đồ thị và trực quan hóa, tôi vẫn nghĩ rằng ggplot2 của R là hàng đầu về cả cú pháp, khả năng tùy chỉnh và kết quả [phải thừa nhận rằng tôi không biết matplotlib cũng như ggplot]. Về chức năng, tôi không thể tìm thấy sự khác biệt lớn giữa hai ngôn ngữ và tôi có thể nói rằng cả hai đều có giá trị riêng. Đối với tôi, R trở nên tự nhiên hơn vì đó là thứ tôi thông thạo hơn, nhưng tôi có thể hiểu tại sao Python cũng có sức hấp dẫn và tôi nghĩ mình sẽ nỗ lực hơn nữa để sử dụng cả hai ngôn ngữ trong các dự án tương lai của mình
R và Python
R và Python đều là ngôn ngữ nguồn mở được sử dụng trong nhiều lĩnh vực phân tích dữ liệu. Sự khác biệt chính của chúng là R có truyền thống hướng đến phân tích thống kê, trong khi Python thì tổng quát hơn. Cả hai đều bao gồm một bộ sưu tập lớn các gói cho các tác vụ cụ thể và có một cộng đồng đang phát triển cung cấp hỗ trợ và hướng dẫn trực tuyến
Để có cái nhìn tổng quan về các điểm mạnh và điểm yếu tương ứng của ngôn ngữ, hãy xem
Phân tích so sánh dữ liệu bộ gen
Để so sánh trực tiếp R và Python, tôi đang theo dõi “Giới thiệu toàn diện về bộ gen của bạn với ngăn xếp SciPy” của Zhuyi Xue [với một số điều chỉnh nhỏ ở đây và ở đó]. Anh ấy giới thiệu rất hay về dữ liệu nên tôi sẽ không nhắc lại ở đây mà tập trung vào phần so sánh giữa các dòng code
Đối với R, tôi đang làm việc với RStudio, đối với Python với Anaconda và Spyder
con trăn
Đối với phân tích này, chúng tôi cần ngăn xếp SciPy với gấu trúc để sắp xếp dữ liệu và matplotlib để trực quan hóa. Anaconda đã đi kèm với tất cả các gói mà chúng tôi cần. Đầu tiên Zhuyi Xue nhập pandas dưới dạng “pd”, để chúng ta có thể gọi hàm pandas bằng cách thêm tiền tố cho chúng là “pd. ”
R
Mặc dù mã có thể được sao chép với cơ sở R, nhưng tôi thích dplyr hơn để sắp xếp dữ liệu và ggplot2 để trực quan hóa
library[dplyr]
library[ggplot2]
Đọc trong dữ liệu
Đọc dữ liệu dễ dàng trong cả R và Python. Mã chúng ta cần đọc trong tệp có thể so sánh giữa R và Python. Zhuyi Xue đã chỉ định "nén = 'gzip'", nhưng điều này sẽ không cần thiết vì mặc định là suy ra nó từ hậu tố tệp
Một điểm khác biệt lớn trong cú pháp chung mà chúng ta có thể thấy ở đây. Các giá trị đúng/sai kiểu Boolean được viết hoa toàn bộ trong chữ R [TRUE/FALSE], trong khi Python sử dụng cách viết hoa chữ cái đầu tiên [True/False]. Nguyên tắc tương tự áp dụng cho “không”
con trăn
df = pd.read_csv['Homo_sapiens.GRCh38.85.gff3.gz',
compression = 'gzip',
sep = '\t',
comment = '#',
low_memory = False,
header = None,
names = ['seqid', 'source', 'type', 'start', 'end', 'score', 'strand', 'phase', 'attributes']]
df.head[]
R
df %”. Mặc dù biểu tượng này không dễ gõ, nhưng chức năng của nó thường vượt trội so với cơ sở R, đặc biệt nếu bạn cần chạy nhiều chức năng trên một khung dữ liệu. Tuy nhiên, chỉ với một hoặc hai chức năng, tôi thường giữ cơ sở R vì nó ngắn hơn
con trăn
df.seqid.unique[] # alternatively: df['seqid'].unique[]
R
## [1] 1 10 11 12 13 14
## [7] 15 16 17 18 19 2
## [13] 20 21 22 3 4 5
## [19] 6 7 8 9 GL000008.2 GL000009.2
## [25] GL000194.1 GL000195.1 GL000205.2 GL000208.1 GL000213.1 GL000214.1
## [31] GL000216.2 GL000218.1 GL000219.1 GL000220.1 GL000221.1 GL000224.1
## [37] GL000225.1 GL000226.1 KI270302.1 KI270303.1 KI270304.1 KI270305.1
## [43] KI270310.1 KI270311.1 KI270312.1 KI270315.1 KI270316.1 KI270317.1
## [49] KI270320.1 KI270322.1 KI270329.1 KI270330.1 KI270333.1 KI270334.1
## [55] KI270335.1 KI270336.1 KI270337.1 KI270338.1 KI270340.1 KI270362.1
## [61] KI270363.1 KI270364.1 KI270366.1 KI270371.1 KI270372.1 KI270373.1
## [67] KI270374.1 KI270375.1 KI270376.1 KI270378.1 KI270379.1 KI270381.1
## [73] KI270382.1 KI270383.1 KI270384.1 KI270385.1 KI270386.1 KI270387.1
## [79] KI270388.1 KI270389.1 KI270390.1 KI270391.1 KI270392.1 KI270393.1
## [85] KI270394.1 KI270395.1 KI270396.1 KI270411.1 KI270412.1 KI270414.1
## [91] KI270417.1 KI270418.1 KI270419.1 KI270420.1 KI270422.1 KI270423.1
## [97] KI270424.1 KI270425.1 KI270429.1 KI270435.1 KI270438.1 KI270442.1
## [103] KI270448.1 KI270465.1 KI270466.1 KI270467.1 KI270468.1 KI270507.1
## [109] KI270508.1 KI270509.1 KI270510.1 KI270511.1 KI270512.1 KI270515.1
## [115] KI270516.1 KI270517.1 KI270518.1 KI270519.1 KI270521.1 KI270522.1
## [121] KI270528.1 KI270529.1 KI270530.1 KI270538.1 KI270539.1 KI270544.1
## [127] KI270548.1 KI270579.1 KI270580.1 KI270581.1 KI270582.1 KI270583.1
## [133] KI270584.1 KI270587.1 KI270588.1 KI270589.1 KI270590.1 KI270591.1
## [139] KI270593.1 KI270706.1 KI270707.1 KI270708.1 KI270709.1 KI270710.1
## [145] KI270711.1 KI270712.1 KI270713.1 KI270714.1 KI270715.1 KI270716.1
## [151] KI270717.1 KI270718.1 KI270719.1 KI270720.1 KI270721.1 KI270722.1
## [157] KI270723.1 KI270724.1 KI270725.1 KI270726.1 KI270727.1 KI270728.1
## [163] KI270729.1 KI270730.1 KI270731.1 KI270732.1 KI270733.1 KI270734.1
## [169] KI270735.1 KI270736.1 KI270737.1 KI270738.1 KI270739.1 KI270740.1
## [175] KI270741.1 KI270742.1 KI270743.1 KI270744.1 KI270745.1 KI270746.1
## [181] KI270747.1 KI270748.1 KI270749.1 KI270750.1 KI270751.1 KI270752.1
## [187] KI270753.1 KI270754.1 KI270755.1 KI270756.1 KI270757.1 MT
## [193] X Y
## 194 Levels: 1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 3 4 5 6 7 8 .. Y
# with dplyr:
# df %>% select[seqid] %>% unique
- có bao nhiêu seqids độc đáo?
Để có được số lượng mục nhập duy nhất trong cột “seqid”, chúng ta chỉ cần nối thêm “. shape” vào mã Python ở trên. Trong R, chúng ta có thể bọc mã R ở trên bằng hàm “length[]” hoặc sử dụng dplyr và piping thay thế. Nếu chúng ta sử dụng cái sau, chúng ta cần sử dụng hàm “nrow[]” vì cơ sở R trả về một vectơ, trong khi dplyr trả về một khung dữ liệu. Ở đây, chúng ta có thể thấy rằng với hai chức năng, sử dụng dplyr vẫn còn nhiều mã hơn một chút nhưng nó đã trông gọn gàng hơn nhiều
con trăn
R
# with dplyr:
# df %>% select[seqid] %>% unique %>% nrow
Để đếm tần suất của từng mục nhập duy nhất trong cột “nguồn”, chúng tôi sử dụng hàm “value_counts[]” trong Python và hàm “table[]” trong R. Hai chức năng này khác nhau về cách chúng sắp xếp bảng đầu ra. value_counts[] sắp xếp theo tần suất giảm dần, trong khi R sắp xếp các biến theo thứ tự bảng chữ cái. Để sắp xếp thứ tự dữ liệu như trong Python, chúng ta cần thêm hàm “sort[]” vào mã R của mình
con trăn
R
________số 8
##
## havana ensembl_havana ensembl . mirbase
## 1441093 745065 228212 182510 4701
## GRCh38 insdc
## 194 74
df = pd.read_csv['Homo_sapiens.GRCh38.85.gff3.gz',
compression = 'gzip',
sep = '\t',
comment = '#',
low_memory = False,
header = None,
names = ['seqid', 'source', 'type', 'start', 'end', 'score', 'strand', 'phase', 'attributes']]
df.head[]
0Bao nhiêu bộ gen không hoàn chỉnh?
Chúng tôi hiện đang đặt lại khung dữ liệu ban đầu của mình và gán cho nó một tên đối tượng mới bằng “ = “ hoặc “ % select[seqid] %>% unique
5# with dplyr:
# df %>% select[seqid] %>% unique
6Và bây giờ chúng tôi sản xuất cốt truyện cuối cùng. một biểu đồ đường của chiều dài nhiễm sắc thể theo số lượng gen trên mỗi nhiễm sắc thể. Đối với Python, chúng tôi lại sử dụng matplotlib và đối với R các gói ggplot2. Bởi vì Zhuyi Xue tạo một khung dữ liệu mới và điều chỉnh phần nào cốt truyện, mã ggplot2 của chúng tôi ở đây đơn giản và gọn gàng hơn