Tìm giá trị trung bình bằng hàm map

Các nhà dịch tễ học thường phải phân tích lặp lại trên các phân nhóm như quốc gia, quận hoặc nhóm tuổi. Đây chỉ là một vài trong số rất nhiều tình huống yêu cầu việc lặp lại. Mã hóa các thao tác lặp lại của bạn bằng cách sử dụng các phương pháp bên dưới sẽ giúp bạn thực hiện các tác vụ lặp đi lặp lại như vậy nhanh hơn, giảm khả năng xảy ra lỗi và giảm độ dài code.

Chương này sẽ giới thiệu hai cách tiếp cận đối với các thao tác lặp lại - sử dụng các vòng lặp for và package purrr.

Trong purrr, chúng tôi cũng sẽ cung cấp một số ví dụ về cách tạo và xử lý danh sách

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

5.

Chuẩn bị

Gọi packages

Đoạn code này hiển thị cách gọi các packages cần thiết cho phần phân tích. Trong sổ tay này, chúng tôi nhấn mạnh đến hàm

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

6 từ package pacman, cài đặt package nếu cần và gọi nó ra để sử dụng. Bạn cũng có thể gọi các package đã cài đặt với hàm

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

7 từ base R. Xem chương để biết thêm thông tin về packages R.

pacman::p_load(

 rio,         # import/export
 here,        # file locator
 purrr,       # iteration
 tidyverse    # data management and visualization
)

Nhập dữ liệu

Chúng tôi nhập dataset về các trường hợp từ một vụ dịch Ebola mô phỏng. Nếu bạn muốn làm theo, hãy nhấp để tải xuống linelist “sạch” (dưới dạng tệp .rds). Nhập dữ liệu bằng hàm

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

8 từ package rio (nó xử lý nhiều loại tệp như .xlsx, .csv, .rds - xem chương để biết chi tiết).

# import the linelist linelist <- import("linelist_cleaned.rds")

50 hàng đầu tiên của linelist được hiển thị bên dưới.

vòng lặp for

vòng lặp for trong R

Vòng lặp for không được nhấn mạnh trong R, nhưng phổ biến trong các ngôn ngữ lập trình khác. Khi mới bắt đầu, chúng có thể hữu ích để học và thực hành vì chúng dễ “khám phá”, “gỡ lỗi” hơn và nắm bắt chính xác những gì đang xảy ra cho mỗi lần lặp, đặc biệt là khi bạn chưa cảm thấy thoải mái khi viết các hàm của riêng mình.

Bạn có thể chuyển nhanh qua phần vòng lặp for tới phần lặp với các hàm được tạo với purrr (xem ).

Cấu phần cốt lõi

Một vòng lặp for có ba phần cốt lõi:

  1. Chuỗi các phần tử cần lặp lại
  2. Các thao tác để tiến hành cho mỗi phần tử trong chuỗi
  3. Vùng chứa cho kết quả (tùy chọn)

Cú pháp cơ bản là:

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

9. Lưu ý dấu ngoặc đơn và dấu ngoặc nhọn. Kết quả có thể được in ra console hoặc được lưu trữ trong một đối tượng vùng chứa.

Dưới đây là một ví dụ đơn giản về vòng lặp for.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

# There is no "container" in this example

Chuỗi

Đây là phần “for” của vòng lặp for - các thao tác sẽ chạy “cho (for)” từng phần tử trong chuỗi. Chuỗi có thể là một loạt các giá trị (ví dụ: tên của khu vực pháp lý, bệnh, tên cột, phần tử danh sách, v.v.) hoặc nó có thể là một chuỗi các số liên tiếp (ví dụ: 1,2,3,4,5). Mỗi cách tiếp cận được mô tả dưới đây có các tiện ích riêng của chúng.

Cấu trúc cơ bản của biểu thức chuỗi là

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

0.

  • Bạn có thể viết bất kỳ ký tự hoặc từ nào thay cho “item” (ví dụ: “i”, “num”, “hosp”, “district”, v.v.). Giá trị của “item” này thay đổi theo từng lần lặp lại của vòng lặp, tiếp tục qua từng giá trị trong vector.
  • Vector có thể là các giá trị ký tự, tên cột hoặc có thể là một chuỗi số - đây là những giá trị sẽ thay đổi theo mỗi lần lặp. Bạn có thể sử dụng chúng trong các thao tác vòng lặp for bằng cách sử dụng thuật ngữ “item”.

Ví dụ: chuỗi giá trị ký tự

Trong ví dụ này, một vòng lặp được thực hiện cho mỗi giá trị được xác định trước trong một vector ký tự của tên bệnh viện.

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

Chúng tôi đã chọn thuật ngữ

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

1 để đại diện cho các giá trị từ vector

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

2. Đối với lần lặp đầu tiên của vòng lặp, giá trị của

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

1 sẽ là

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

4. Đối với vòng lặp thứ hai, nó sẽ là

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

5. Và cứ như thế…

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

Ví dụ: chuỗi tên cột

Đây là một biến thể của chuỗi ký tự ở trên, trong đó tên của một đối tượng R hiện có được trích xuất và trở thành vector. Ví dụ, tên cột của dataframe. Trong code hoạt động của vòng lặp for, tên cột có thể được sử dụng để lập chỉ mục (tập hợp con) dataframe ban đầu của chúng.

Dưới đây, chuỗi là

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

6 (tên cột) của dataframe

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7. Tên “item” của chúng ta là

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

8, sẽ đại diện cho từng tên cột khi các vòng lặp diễn ra.

Với ví dụ này, chúng tôi bao gồm code thao tác bên trong vòng lặp for, được chạy cho mọi giá trị trong chuỗi. Trong code này, các giá trị trình tự (tên cột) được sử dụng để chỉ mục (tập hợp con) từng phần tử một trong

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7. Như đã dạy trong chương , dấu ngoặc vuông kép

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

0 được sử dụng cho tập hợp con. Cột kết quả được chuyển đến

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

1, sau đó đến

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

2 để tạo ra số giá trị trong cột bị thiếu. Kết quả được in ra console - một số cho mỗi cột.

Một lưu ý về lập chỉ mục với tên cột - bất cứ khi nào tham chiếu đến chính cột đó, đừng chỉ viết “col”!

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

8 chỉ đại diện cho tên cột ký tự! Để tham chiếu đến toàn bộ cột, bạn phải sử dụng tên cột dưới dạng chỉ mục trên

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7 thông qua

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

5.

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

Dãy số

Theo cách tiếp cận này, dãy số là một chuỗi các số liên tiếp. Do đó, giá trị của “item” không phải là giá trị ký tự (ví dụ: “Central Hospital” hoặc “date_onset”) mà là một số. Điều này rất hữu ích cho việc lặp qua các dataframes, vì bạn có thể sử dụng số “item” bên trong vòng lặp for để lập chỉ mục dataframe theo số hàng.

Ví dụ: giả sử bạn muốn lặp qua mọi hàng trong dataframe của mình và trích xuất thông tin nhất định. “Item” của bạn sẽ là số hàng số. Thông thường, “item” trong trường hợp này được viết là

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6.

Quá trình vòng lặp for có thể được giải thích bằng lời là “đối với mọi mục trong chuỗi số từ 1 đến tổng số hàng trong dataframe của tôi, hãy thực hiện X”. Đối với lần lặp đầu tiên của vòng lặp, giá trị của “item”

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6 sẽ là 1. Đối với lần lặp thứ hai,

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6 sẽ là 2, v.v.

Đây là hình thức của chuỗi trong code:

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

9 trong đó

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6 đại diện cho “item”và

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

1 tạo ra một chuỗi liên tiếp số từ 1 đến số hàng trong

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7.

# import the linelist linelist <- import("linelist_cleaned.rds")

0

Nếu bạn muốn chuỗi là số, nhưng bạn đang bắt đầu từ một vector (không phải dataframe), hãy sử dụng hàm tắt

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

3 để trả về một dãy số cho mỗi phần tử trong vector. Ví dụ:

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

4.

Đoạn code dưới đây thực sự trả về các số, sẽ trở thành giá trị của

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6 trong vòng lặp tương ứng của chúng.

# import the linelist linelist <- import("linelist_cleaned.rds")

1

# import the linelist linelist <- import("linelist_cleaned.rds")

2

Một lợi thế của việc sử dụng các số trong chuỗi là cũng dễ dàng sử dụng số

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6 để lập chỉ mục vùng chứa lưu trữ các kết quả đầu ra của vòng lặp. Có một ví dụ về điều này trong phần Thao tác bên dưới.

Các thao tác

Đây là code trong dấu ngoặc nhọn

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

7 của vòng lặp for. Bạn muốn code này chạy cho từng “item” trong chuỗi. Do đó, hãy thận trọng với mọi phần code của bạn thay đổi bởi “item” đều được mã hóa chính xác để nó thực sự thay đổi! Ví dụ. nhớ sử dụng

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

8 để lập chỉ mục.

Trong ví dụ dưới đây, chúng tôi lặp lại từng hàng trong

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7. Giá trị

# import the linelist linelist <- import("linelist_cleaned.rds")

00 và

# import the linelist linelist <- import("linelist_cleaned.rds")

01 của mỗi hàng được dán lại với nhau và được lưu trữ trong vector ký tự vùng chứa

# import the linelist linelist <- import("linelist_cleaned.rds")

02. Lưu ý cách chúng tôi cũng sử dụng lập chỉ mục

# import the linelist linelist <- import("linelist_cleaned.rds")

03 để lưu đầu ra của vòng lặp vào vị trí chính xác trong vector “container”.

# import the linelist linelist <- import("linelist_cleaned.rds")

3

# import the linelist linelist <- import("linelist_cleaned.rds")

4

Vùng chứa

Đôi khi kết quả của vòng lặp for của bạn sẽ được in ra console hoặc cửa sổ RStudio Plots. Lần khác, bạn sẽ muốn lưu trữ các kết quả đầu ra trong một “vùng chứa” để sử dụng sau này. Một vùng chứa như vậy có thể là một vector, một data frame hoặc thậm chí là một danh sách.

Hiệu quả nhất là tạo vùng chứa cho các kết quả thậm chí trước khi bắt đầu vòng lặp for. Trong thực tế, điều này có nghĩa là tạo một vector, data frame hoặc danh sách trống. Chúng có thể được tạo bằng các hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

04 cho vectors hoặc danh sách, hoặc với

# import the linelist linelist <- import("linelist_cleaned.rds")

05 và

# import the linelist linelist <- import("linelist_cleaned.rds")

06 cho một data frame.

Vector trống

Sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

04 và chỉ định

# import the linelist linelist <- import("linelist_cleaned.rds")

08 dựa trên lớp phân loại dự kiến của các đối tượng mà bạn sẽ chèn - “double” (để giữ số), “ký tự” hoặc “logic”. Bạn cũng nên đặt trước

# import the linelist linelist <- import("linelist_cleaned.rds")

09. Đây phải là độ dài chuỗi vòng lặp for của bạn.

Giả sử bạn muốn lưu trữ thời gian nhập viện trễ trung bình cho mỗi bệnh viện. Bạn sẽ sử dụng “double” và đặt độ dài là số đầu ra dự kiến (số bệnh viện duy nhất trong data set).

# import the linelist linelist <- import("linelist_cleaned.rds")

5

Data frame trống

Bạn có thể tạo một data frame trống bằng cách chỉ định số hàng và cột như sau:

Danh sách trống

Bạn có thể muốn lưu trữ một số biểu đồ được tạo bởi vòng lặp for trong danh sách. Một danh sách giống như vector, nhưng chứa các đối tượng R khác bên trong nó có thể thuộc các lớp khác nhau. Các phần tử trong danh sách có thể là một số, một dataframe, một vector và thậm chí là một danh sách khác.

Bạn thực sự khởi tạo một danh sách trống bằng cách sử dụng cùng một lệnh

# import the linelist linelist <- import("linelist_cleaned.rds")

04 như trên, nhưng với

# import the linelist linelist <- import("linelist_cleaned.rds")

11. Chỉ định độ dài như bạn muốn.

# import the linelist linelist <- import("linelist_cleaned.rds")

6

In

Lưu ý rằng để in từ bên trong vòng lặp for, bạn có thể sẽ cần phải đưa hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

12 vào.

Trong ví dụ dưới đây, chuỗi là một vector ký tự rõ ràng, được sử dụng để đặt linelist con theo bệnh viện. Kết quả không được lưu trữ trong vùng chứa mà được in ra console với hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

12.

# import the linelist linelist <- import("linelist_cleaned.rds")

7

# import the linelist linelist <- import("linelist_cleaned.rds")

8

Kiểm tra vòng lặp for

Để kiểm tra vòng lặp của mình, bạn có thể chạy lệnh để gán tạm thời “item”, chẳng hạn như

# import the linelist linelist <- import("linelist_cleaned.rds")

14 hoặc

# import the linelist linelist <- import("linelist_cleaned.rds")

15. Thực hiện việc này bên ngoài vòng lặp và sau đó chỉ chạy code thao tác của bạn (code trong dấu ngoặc nhọn) để xem liệu kết quả mong đợi có được tạo ra hay không.

Lặp lại biểu đồ

Để đặt tất cả ba thành phần lại với nhau (vùng chứa, trình tự và thao tác), chúng ta hãy cố gắng vẽ biểu đồ đường cong dịch bệnh cho mỗi bệnh viện (xem chương ).

Chúng tôi có thể tạo ra một đường cong dịch bệnh đẹp về tất cả các trường hợp theo giới tính bằng cách sử dụng package incidence2 như bên dưới:

# import the linelist linelist <- import("linelist_cleaned.rds")

9

Tìm giá trị trung bình bằng hàm map

Để tạo ra một biểu đồ riêng cho từng trường hợp của bệnh viện, chúng ta có thể đặt code đường cong dịch bệnh này trong vòng lặp for.

Đầu tiên, chúng tôi lưu một vector được đặt tên duy nhất của các tên bệnh viện,

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

2. Vòng lặp for sẽ chạy một lần cho mỗi tên sau:

# import the linelist linelist <- import("linelist_cleaned.rds")

17. Mỗi lần lặp lại của vòng lặp for, tên bệnh viện hiện tại từ vector sẽ được biểu diễn dưới dạng

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

1 để sử dụng trong vòng lặp.

Trong các thao tác vòng lặp, bạn có thể viết code R như bình thường, nhưng cần biết rằng giá trị của “item” (

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

1 trong trường hợp này) sẽ thay đổi. Trong vòng lặp này:

  • Một

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    20 được áp dụng cho

    a 'for loop' with character sequence

    for (hosp in hospital_names){ # sequence
       # OPERATIONS HERE  
    
    }

    7, sao cho cột

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    22 phải bằng giá trị hiện tại của

    a 'for loop' with character sequence

    for (hosp in hospital_names){ # sequence
       # OPERATIONS HERE  
    
    }
    1
  • Đối tượng tỷ lệ mắc được tạo trên linelist đã lọc
  • Biểu đồ cho bệnh viện hiện tại được tạo, với tiêu đề tự động điều chỉnh sử dụng

    a 'for loop' with character sequence

    for (hosp in hospital_names){ # sequence
       # OPERATIONS HERE  
    
    }
    1
  • Biểu đồ cho bệnh viện hiện tại được lưu tạm thời và sau đó được in
  • Sau đó, vòng lặp di chuyển tiếp để lặp lại với bệnh viện tiếp theo trong

    a 'for loop' with character sequence

    for (hosp in hospital_names){ # sequence
       # OPERATIONS HERE  
    
    }
    2

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

0

Tìm giá trị trung bình bằng hàm map
Tìm giá trị trung bình bằng hàm map
Tìm giá trị trung bình bằng hàm map
Tìm giá trị trung bình bằng hàm map
Tìm giá trị trung bình bằng hàm map
Tìm giá trị trung bình bằng hàm map

Theo dõi tiến trình của một vòng lặp

Một vòng lặp có nhiều lần lặp có thể chạy trong nhiều phút hoặc thậm chí hàng giờ. Do đó, có thể hữu ích khi in tiến trình ra R console. Câu lệnh

# import the linelist linelist <- import("linelist_cleaned.rds")

26 dưới đây có thể được đặt trong các thao tác vòng lặp để in mỗi số thứ 100. Chỉ cần điều chỉnh nó để

`for (col in names(linelist)){ # loop runs for each column in linelist; column name represented by "col"

Example operations code - print number of missing values in column

print(sum(is.na(linelist[[col]]))) # linelist is indexed by current value of "col" }`

6 là “item” trong vòng lặp của bạn.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

1

purrr và các danh sách

Một cách tiếp cận khác đối với các thao tác lặp là package purrr - nó là phương pháp tidyverse để lặp lại.

Nếu bạn phải thực hiện cùng một tác vụ nhiều lần, có lẽ bạn nên tạo một giải pháp tổng thể có thể sử dụng trên nhiều đầu vào. Ví dụ: tạo các biểu đồ cho nhiều khu vực pháp lý, hoặc nhập và kết hợp nhiều tệp.

Ngoài ra còn có một số lợi thế khác đối với purrr - bạn có thể sử dụng nó với các pipes

# import the linelist linelist <- import("linelist_cleaned.rds")

28, nó xử lý lỗi tốt hơn vòng lặp for bình thường, và có cú pháp khá rõ ràng và đơn giản! Nếu bạn đang sử dụng vòng lặp for, bạn có thể tạo vòng lặp rõ ràng và ngắn gọn hơn với purrr!

Hãy nhớ rằng purrr là một công cụ lập trình theo hàm. Có nghĩa là, các thao tác lặp đi lặp lại được gói gọn trong các hàm. Xem chương để tìm hiểu cách viết hàm của riêng bạn.

purrr cũng gần như hoàn toàn dựa trên danh sách và vectors - vì vậy hãy nghĩ về nó như là áp dụng một hàm cho mỗi phần tử của danh sách/vector đó!

Tải packages

purrr là một phần của tidyverse, vì vậy không cần cài đặt/tải một package riêng biệt.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

2

# import the linelist linelist <- import("linelist_cleaned.rds")

29

Một hàm cốt lõi của purrr là

# import the linelist linelist <- import("linelist_cleaned.rds")

29, hàm này “maps” (áp dụng) một hàm cho từng phần tử đầu vào của danh sách/vector bạn cung cấp.

Cú pháp cơ bản là

# import the linelist linelist <- import("linelist_cleaned.rds")

31. Chi tiết hơn như sau:

  • import the linelist

    linelist <- import("linelist_cleaned.rds")

    32 là các đầu vào mà hàm

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    33 sẽ được áp dụng lặp đi lặp lại - ví dụ: vector của tên các khu vực pháp lý, các cột trong data frame hoặc danh sách các data frame
  • import the linelist

    linelist <- import("linelist_cleaned.rds")

    34 là hàm áp dụng cho từng phần tử của đầu vào

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    35 - nó có thể là một hàm như

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    12 đã tồn tại hoặc một hàm tùy chỉnh mà bạn xác định. Hàm thường được viết sau dấu ngã

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    37 (chi tiết bên dưới).

Thêm một số lưu ý về cú pháp:

  • Nếu hàm không cần chỉ định thêm đối số, nó có thể được viết không có dấu ngoặc đơn và không có dấu ngã (ví dụ:

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    38). Để cung cấp các đối số sẽ có cùng giá trị cho mỗi lần lặp, hãy cung cấp chúng trong

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    29 nhưng bên ngoài đối số

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    34, chẳng hạn như

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    41 trong

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    42.
  • Bạn có thể sử dụng

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    35 (hoặc đơn giản là

    import the linelist

    linelist <- import("linelist_cleaned.rds")
  • bên trong hàm

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    34 làm trình giữ chỗ cho giá trị

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    35 của lần lặp đó
  • Sử dụng cú pháp dấu ngã (

    import the linelist

    linelist <- import("linelist_cleaned.rds")
  • để kiểm soát hàm nhiều hơn - viết hàm như bình thường với dấu ngoặc đơn, chẳng hạn như:

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    48. Sử dụng cú pháp này đặc biệt nếu giá trị của một đối số sẽ thay đổi mỗi lần lặp lại hoặc nếu nó là chính giá trị

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    35 (xem ví dụ bên dưới)

** Đầu ra của việc sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29 là một danh sách** - một danh sách là một lớp đối tượng giống như một vector nhưng các phần tử của nó có thể thuộc các lớp khác nhau. Vì vậy, một danh sách được tạo bởi

# import the linelist linelist <- import("linelist_cleaned.rds")

29 có thể chứa nhiều data frames, hoặc nhiều vector, nhiều giá trị đơn lẻ, hoặc thậm chí nhiều danh sách! Có các phiên bản thay thế của

# import the linelist linelist <- import("linelist_cleaned.rds")

29 được giải thích bên dưới, tạo ra các loại kết quả khác (ví dụ:

# import the linelist linelist <- import("linelist_cleaned.rds")

53 để tạo data frame,

# import the linelist linelist <- import("linelist_cleaned.rds")

54 để tạo vectors ký tự và

# import the linelist linelist <- import("linelist_cleaned.rds")

55 để tạo vectors số).

Ví dụ - nhập và kết hợp các trang tính Excel

Hãy biểu diễn với một công việc thường gặp của nhà dịch tễ học: - Bạn muốn nhập một Excel workbook với dữ liệu trường hợp bệnh, nhưng dữ liệu được chia thành các trang tính có tên khác nhau trong workbook. Làm cách nào để bạn nhập và kết hợp các trang tính vào một data frame một cách hiệu quả?

Giả sử chúng tôi được gửi Excel workbook bên dưới. Mỗi trang tính chứa các trường hợp từ một bệnh viện nhất định.

Tìm giá trị trung bình bằng hàm map

Đây là một cách tiếp cận sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29:

  1. import the linelist

    linelist <- import("linelist_cleaned.rds")

    29 hàm

    [1] "Other" "Missing" "St. Mark's Maternity Hospital (SMMH)"

    [4] "Port Hospital" "Military Hospital" "Central Hospital"

    8 để nó chạy qua mỗi trang tính Excel
  2. Kết hợp các data frames đã nhập thành một bằng cách sử dụng

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    59
  3. Trong khi đó, hãy giữ nguyên tên trang tính ban đầu cho mỗi hàng, lưu trữ thông tin này trong một cột mới trong data frame cuối cùng

Đầu tiên, chúng ta cần trích xuất tên trang tính và lưu chúng. Chúng tôi cung cấp đường dẫn tệp của Excel workbook tới hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

60 từ package readxl, sẽ trích xuất tên trang tính. Chúng tôi lưu trữ chúng trong một vector ký tự được gọi là

# import the linelist linelist <- import("linelist_cleaned.rds")

61.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

3

Đây là các tên trang tính:

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

4

Bây giờ chúng ta có tên của vector này,

# import the linelist linelist <- import("linelist_cleaned.rds")

29 có thể cung cấp từng cái một cho hàm

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

8. Trong ví dụ này,

# import the linelist linelist <- import("linelist_cleaned.rds")

61 là

# import the linelist linelist <- import("linelist_cleaned.rds")

35 và

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

8 là hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

33.

Nhớ lại từ chương [Nhập và xuất dữ liệu], khi sử dụng trên Excel workbooks,

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

8 có thể chấp nhận đối số

# import the linelist linelist <- import("linelist_cleaned.rds")

69 để chỉ định trang tính để nhập. Trong hàm

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

8 của

# import the linelist linelist <- import("linelist_cleaned.rds")

33, chúng tôi cung cấp

# import the linelist linelist <- import("linelist_cleaned.rds")

72, giá trị của nó sẽ thay đổi theo mỗi lần lặp thông qua vector

# import the linelist linelist <- import("linelist_cleaned.rds")

61 - đầu tiên là “Central Hospital”, sau đó là “Military Hospital”, v.v.

Lưu ý - bởi vì chúng tôi đã sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29, dữ liệu trong mỗi trang tính Excel sẽ được lưu thành một data frame riêng biệt trong danh sách. Chúng tôi muốn mỗi phần tử danh sách này (data frames) có một tên, vì vậy trước khi chuyển

# import the linelist linelist <- import("linelist_cleaned.rds")

61 đến

# import the linelist linelist <- import("linelist_cleaned.rds")

29, chúng tôi chuyển nó qua

# import the linelist linelist <- import("linelist_cleaned.rds")

77 từ purrr, điều này đảm bảo rằng mỗi phần tử danh sách nhận được tên thích hợp.

Chúng tôi lưu danh sách đầu ra dưới dạng

# import the linelist linelist <- import("linelist_cleaned.rds")

78.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

5

Khi kiểm tra đầu ra, chúng ta thấy rằng dữ liệu từ mỗi trang tính Excel được lưu trong danh sách với một tên. Điều này là tốt, nhưng chúng ta chưa kết thúc ở đây.

Tìm giá trị trung bình bằng hàm map

Cuối cùng, chúng tôi sử dụng hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

59 (từ dplyr) chấp nhận danh sách các data frames có cấu trúc tương tự và kết hợp chúng thành một data frame. Để tạo một cột mới từ phần tử danh sách tên, chúng tôi sử dụng đối số

# import the linelist linelist <- import("linelist_cleaned.rds")

80 và cung cấp cho nó tên mong muốn cho cột mới.

Dưới đây là toàn bộ chuỗi lệnh:

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

6

Và bây giờ chúng ta có một data frame với một cột chứa trang tính ban đầu!

Tìm giá trị trung bình bằng hàm map

Có những biến thể của

# import the linelist linelist <- import("linelist_cleaned.rds")

29 mà bạn nên biết. Ví dụ:

# import the linelist linelist <- import("linelist_cleaned.rds")

53 trả về data frame, không phải danh sách. Vì vậy, chúng ta có thể đã sử dụng nó cho tác vụ ở trên và không cần phải ràng buộc các hàng. Nhưng sau đó chúng ta sẽ không thể nắm bắt được trường hợp nào đến từ trang tính nào (bệnh viện).

Các biến thể khác bao gồm

# import the linelist linelist <- import("linelist_cleaned.rds")

54,

# import the linelist linelist <- import("linelist_cleaned.rds")

55. Đây là những hàm rất hữu ích vì hai lý do. Trước hết, chúng tự động chuyển đổi đầu ra của một hàm lặp thành một vector (không phải danh sách). Thứ hai, chúng có thể kiểm soát rõ ràng lớp mà dữ liệu quay trở lại - bạn đảm bảo rằng dữ liệu của bạn quay trở lại dưới dạng vector ký tự với

# import the linelist linelist <- import("linelist_cleaned.rds")

54, hoặc vector số với

# import the linelist linelist <- import("linelist_cleaned.rds")

55. Hãy quay lại những hàm này sau trong phần sau!

Các hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

87 và

# import the linelist linelist <- import("linelist_cleaned.rds")

88 cũng rất hữu ích để lặp lại - chúng cho phép bạn chỉ định phần tử nào của danh sách nên lặp lại! Chúng hoạt động đơn giản bằng cách áp dụng một vector gồm các chỉ mục/tên (với

# import the linelist linelist <- import("linelist_cleaned.rds")

  1. hoặc một phép kiểm tra logic (với

# import the linelist linelist <- import("linelist_cleaned.rds")

88).

Ví dụ, chúng tôi không muốn đọc trang tính đầu tiên chứa dữ liệu của bệnh viện. Chúng tôi sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

87 thay vì

# import the linelist linelist <- import("linelist_cleaned.rds")

29 và chỉ định đối số

# import the linelist linelist <- import("linelist_cleaned.rds")

93 thành

# import the linelist linelist <- import("linelist_cleaned.rds")

94 có nghĩa là không sử dụng phần tử đầu tiên của

# import the linelist linelist <- import("linelist_cleaned.rds")

35. Ngoài ra, bạn có thể cung cấp một vector gồm các số dương hoặc tên cho

# import the linelist linelist <- import("linelist_cleaned.rds")

93 để chỉ định phần tử nào sẽ sử dụng.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

7

Lưu ý rằng tên trang tính đầu tiên sẽ vẫn xuất hiện như một phần tử của danh sách đầu ra - nhưng nó chỉ là một tên ký tự đơn lẻ (không phải là một data frame). Bạn sẽ cần phải loại bỏ phần tử này trước khi liên kết các hàng. Chúng tôi sẽ trình bày cách xóa và sửa đổi các phần tử danh sách trong phần sau.

Tách và xuất bộ dữ liệu

Dưới đây, chúng tôi đưa ra một ví dụ về cách tách bộ dữ liệu thành các phần và sau đó sử dụng phép lặp

# import the linelist linelist <- import("linelist_cleaned.rds")

29 để xuất từng phần dưới dạng trang tính Excel riêng biệt hoặc dưới dạng tệp CSV riêng biệt.

Tách bộ dữ liệu

Giả sử chúng ta có toàn bộ trường hợp

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7 làm data frame và bây giờ chúng ta muốn tạo một linelist riêng biệt cho từng bệnh viện và xuất từng trường hợp dưới dạng tệp CSV riêng biệt. Dưới đây, chúng tôi thực hiện các bước sau:

Sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

99 (từ dplyr) để tách data frame

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7 theo các giá trị duy nhất trong cột

# import the linelist linelist <- import("linelist_cleaned.rds")

22. Đầu ra là một danh sách chứa một data frame cho mỗi tập hợp con của bệnh viện.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

8

Chúng ta có thể chạy

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

02 và thấy rằng danh sách này chứa 6 data frames (“tibbles”), mỗi khung đại diện cho các trường hợp từ một bệnh viện.

Tìm giá trị trung bình bằng hàm map

Tuy nhiên, lưu ý rằng các data frames trong danh sách không có tên theo mặc định! Chúng tôi muốn mỗi người có một tên và sau đó sử dụng tên đó khi lưu tệp CSV.

Một cách tiếp cận để trích xuất các tên là sử dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

03 (từ dplyr) để trích xuất cột

# import the linelist linelist <- import("linelist_cleaned.rds")

22 từ mỗi data frame trong danh sách. Sau đó, để an toàn, chúng tôi chuyển đổi các giá trị thành ký tự và sau đó sử dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

05 để lấy tên cho data frame cụ thể đó. Tất cả các bước này được áp dụng cho từng data frame thông qua

# import the linelist linelist <- import("linelist_cleaned.rds")

29.

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

9

Bây giờ chúng ta có thể thấy rằng mỗi phần tử trong danh sách đều có một tên. Những tên này có thể được truy cập thông qua

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

07.

Tìm giá trị trung bình bằng hàm map
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

0

Nhiều hơn một cột

# import the linelist linelist <- import("linelist_cleaned.rds")

99

Nếu bạn muốn chia linelist theo nhiều hơn một nhóm cột, chẳng hạn như để tạo tập hợp con linelist theo giao điểm của bệnh viện VÀ giới tính, bạn sẽ cần một cách tiếp cận khác để đặt tên cho các phần tử danh sách. Điều này liên quan đến việc thu thập các “nhóm chính (group keys)” duy nhất bằng cách sử dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

09 từ dplyr - chúng được trả về dưới dạng một data frame. Sau đó, bạn có thể kết hợp các nhóm chính thành các giá trị với

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

10 như được hiển thị bên dưới và gán các tên tập nhóm này cho

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

11.

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

1

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

2

Bây giờ chúng ta kết hợp các nhóm với nhau, được phân tách bằng dấu gạch ngang và gán chúng làm tên của các phần tử danh sách trong

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

11. Thao tác này sẽ mất thêm vài dòng khi chúng ta thay thế

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

13 bằng “Missing”, sử dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

10 từ dplyr để kết hợp các giá trị cột với nhau (phân tách bằng dấu gạch ngang), sau đó chuyển đổi thành vector không tên để nó có thể được dùng làm tên của

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

11.

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

3

Xuất dưới dạng trang tính Excel

Để xuất linelists bệnh viện dưới dạng Excel workbook với một linelist trên mỗi trang tính, chúng tôi chỉ có thể cung cấp danh sách có tên

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

11 cho hàm

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

17 từ package writexl. Điều này có khả năng lưu một Excel workbook với nhiều trang tính. Tên phần tử danh sách được tự động áp dụng làm tên trang tính.

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

4

Bây giờ bạn có thể mở tệp Excel và thấy rằng mỗi bệnh viện có một trang tính riêng.

Tìm giá trị trung bình bằng hàm map

Xuất dưới dạng tệp CSV

Đây là lệnh phức tạp hơn một chút, nhưng bạn cũng có thể xuất từng linelist dành riêng cho bệnh viện dưới dạng tệp CSV riêng biệt, với tên tệp dành riêng cho bệnh viện.

Một lần nữa, chúng tôi sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29: chúng tôi lấy vector của tên phần tử danh sách (được hiển thị ở trên) và sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29 để lặp lại chúng, áp dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

20 (từ package rio, xem chương [Nhập và xuất dữ liệu]) trên data frame với danh sách

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

11 có tên đó. Chúng tôi cũng sử dụng tên để tạo một tên tệp duy nhất. Đây là các bước thực hiện:

  • Chúng ta bắt đầu với vector tên kí tự, được chuyển tới

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    29 dưới dạng

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    35
  • Hàm

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    33 là

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}" 20, hàm này yêu cầu một data frame và một đường dẫn tệp để ghi vào
  • Đầu vào

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    35 (tên bệnh viện) được sử dụng trong

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    33 để trích xuất/lập chỉ mục phần tử cụ thể đó của danh sách

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    11. Điều này làm cho mỗi lần chỉ một data frame được cung cấp cho

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}" 20.
  • Ví dụ: khi

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    29 lặp lại cho “Military Hospital”, thì

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    31 sẽ là

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    32, do đó trả về phần tử thứ hai của

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}" 11 - đó là tất cả các trường hợp từ Military Hospital.
  • Đường dẫn tệp được cung cấp cho for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    20 là động thông qua việc sử dụng

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    35 (xem chương ):

    • for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"

      36 được sử dụng để lấy cơ sở của đường dẫn tệp và chỉ định thư mục “data” (lưu ý dấu nháy đơn để không làm gián đoạn dấu ngoặc kép

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"
      35)
  • Sau đó là dấu gạch chéo for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    38, rồi lại

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    35 in tên bệnh viện hiện tại để làm cho tệp có thể nhận dạng được
  • Cuối cùng là phần mở rộng “.csv” mà for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}" 20 sử dụng để tạo tệp CSV

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

5

Bây giờ bạn có thể thấy rằng mỗi tệp được lưu trong thư mục “data” của Dự án R “Epi_R_handbook”!

Tìm giá trị trung bình bằng hàm map

Hàm tùy chỉnh

Bạn có thể muốn tạo một hàm của riêng mình để đưa vào

# import the linelist linelist <- import("linelist_cleaned.rds")

29.

Giả sử chúng ta muốn tạo đường cong dịch bệnh cho từng trường hợp của bệnh viện. Để thực hiện việc này với purrr, hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

33 của chúng ta có thể là

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

43 và các phần mở rộng bằng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

44 như bình thường. Vì đầu ra của

# import the linelist linelist <- import("linelist_cleaned.rds")

29 luôn là một danh sách nên các biểu đồ được lưu trữ trong một danh sách. Bởi vì chúng là các biểu đồ, chúng có thể được trích xuất và vẽ bằng hàm

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

46 từ package ggpubr (documentation).

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

6

Tìm giá trị trung bình bằng hàm map

Nếu code

# import the linelist linelist <- import("linelist_cleaned.rds")

29 này trông quá lộn xộn, bạn có thể đạt được kết quả tương tự bằng cách lưu lệnh

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

43 cụ thể của mình dưới dạng một hàm tùy chỉnh do người dùng xác định, ví dụ, chúng ta có thể đặt tên nó là

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

49. Hàm này sau đó được sử dụng trong

# import the linelist linelist <- import("linelist_cleaned.rds")

29.

# import the linelist linelist <- import("linelist_cleaned.rds")

35 sẽ được thay thế lặp lại bằng tên bệnh viện và được sử dụng làm

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

52 trong hàm

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

49. Xem chương về .

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

7

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

8

Áp dụng một hàm qua nhiều cột

Một trường hợp sử dụng phổ biến khác là áp dụng một hàm trên nhiều cột. Dưới đây, chúng tôi

# import the linelist linelist <- import("linelist_cleaned.rds")

29 hàm

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

55 qua các cột số trong data frame

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7, so sánh các giá trị số theo giới tính.

Nhớ lại từ chương về rằng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

55 có thể nhận đầu vào ở định dạng công thức, chẳng hạn như

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

58. Trong ví dụ này, chúng tôi làm như sau:

  • Các cột số được chọn từ

    a 'for loop' with character sequence

    for (hosp in hospital_names){ # sequence
       # OPERATIONS HERE  
    
    }

    7 - những cột này trở thành đầu vào

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    35 cho

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    29
  • Hàm for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    55 được cung cấp dưới dạng hàm

    import the linelist

    linelist <- import("linelist_cleaned.rds")
    33, được áp dụng cho mỗi cột số
  • Trong dấu ngoặc đơn của for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    55:

    • dấu

      import the linelist

      linelist <- import("linelist_cleaned.rds")

      37 đầu tiên đứng trước

      import the linelist

      linelist <- import("linelist_cleaned.rds")

      33 mà

      import the linelist

      linelist <- import("linelist_cleaned.rds")

      29 sẽ lặp qua

      import the linelist

      linelist <- import("linelist_cleaned.rds")
      35
    • import the linelist

      linelist <- import("linelist_cleaned.rds")

      35 đại diện cho cột hiện tại được cung cấp cho hàm

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"
      55
    • dấu

      import the linelist

      linelist <- import("linelist_cleaned.rds")
      37 thứ hai là một phần của phương trình t-test được mô tả ở trên
    • hàm for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"

      55 yêu cầu một cột nhị phân ở phía bên phải của phương trình. Chúng tôi đưa vector

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"

      73 một cách độc lập và có ý nghĩa thống kê (lưu ý rằng nó không được bao gồm trong

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"
      74).

# import the linelist linelist <- import("linelist_cleaned.rds")

29 trả về một danh sách, vì vậy đầu ra là một danh sách các kết quả t-test - một danh sách phần tử cho mỗi cột số được phân tích.

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

9

Đây là danh sách

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

76 trông như thế nào khi được mở (Cửa sổ Viewer) trong RStudio. Chúng tôi đã đánh dấu các phần quan trọng đối với các ví dụ trong trang này.

  • Ở trên cùng, bạn có thể thấy toàn bộ danh sách được đặt tên là for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    76 và có năm phần tử. Năm phần tử đó được đặt tên là

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    01,

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    79,

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    80,

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    81,

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    82 theo mỗi biến được sử dụng trong t-test với

    import the linelist

    linelist <- import("linelist_cleaned.rds")

    00 từ

    a 'for loop' with character sequence

    for (hosp in hospital_names){ # sequence
       # OPERATIONS HERE  
    
    }
    7.
  • Mỗi phần tử trong số năm phần tử đó đều là danh sách, với các phần tử bên trong chúng, chẳng hạn như for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    85 và

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    86. Một số phần tử như

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    85 là các số đơn lẻ, trong khi một số phần tử như

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    88 bao gồm hai hoặc nhiều phần tử (

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    89 và

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}" 90).

Tìm giá trị trung bình bằng hàm map

Lưu ý: Hãy nhớ rằng nếu bạn chỉ muốn áp dụng một hàm cho một số cột nhất định trong data frame, bạn cũng có thể chỉ cần sử dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

91 và

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

92, như được giải thích trong chương . Dưới đây là một ví dụ về việc áp dụng

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

93 cho chỉ các cột “age”. Lưu ý vị trí của dấu ngoặc đơn và dấu phẩy.

# There is no "container" in this example

0

Trích xuất từ danh sách

Khi

# import the linelist linelist <- import("linelist_cleaned.rds")

29 tạo ra một đầu ra của lớp danh sách, chúng ta sẽ dành một chút thời gian thảo luận về cách trích xuất dữ liệu từ danh sách bằng cách sử dụng các hàm purrr đi kèm. Để minh họa điều này, chúng tôi sẽ sử dụng danh sách

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

76 từ phần trước. Đây là danh sách gồm 5 danh sách - mỗi danh sách trong số 5 danh sách chứa kết quả của t-test giữa một cột từ data frame

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

7 và cột nhị phân

# import the linelist linelist <- import("linelist_cleaned.rds")

00 của nó. Xem hình ảnh trong phần trên để có hình ảnh về cấu trúc danh sách.

Tên của các phần tử

Để trích xuất tên của chính các phần tử, chỉ cần sử dụng

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

6 từ base R. Trong trường hợp này, chúng tôi sử dụng

# a 'for loop' with character sequence for (hosp in hospital_names){ # sequence

   # OPERATIONS HERE
}

6 trên

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

76 để trả về tên của mỗi danh sách con, là tên của 5 biến đã thực hiện t-tests.

# There is no "container" in this example

1

Các phần tử theo tên hoặc vị trí

Để trích xuất các phần tử danh sách theo tên hoặc theo vị trí, bạn có thể sử dụng dấu ngoặc

## [1] 0
## [1] 0
## [1] 2087
## [1] 256
## [1] 0
## [1] 936
## [1] 1323
## [1] 278
## [1] 86
## [1] 0
## [1] 86
## [1] 86
## [1] 86
## [1] 0
## [1] 0
## [1] 0
## [1] 2088
## [1] 2088
## [1] 0
## [1] 0
## [1] 0
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 249
## [1] 149
## [1] 765
## [1] 0
## [1] 256

8 như được mô tả trong chương . Dưới đây chúng tôi sử dụng dấu ngoặc kép để lập chỉ mục danh sách

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

02 và hiển thị phần tử đầu tiên là kết quả của t-test trên

# import the linelist linelist <- import("linelist_cleaned.rds")

01.

# There is no "container" in this example

2

# There is no "container" in this example

3

# There is no "container" in this example

4

# There is no "container" in this example

5

Tuy nhiên, dưới đây chúng tôi sẽ trình bày việc sử dụng các hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

29 và

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05 của purrr đơn giản và linh hoạt để đạt được kết quả tương tự.

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05 kéo ra các phần tử theo tên hoặc theo vị trí. Ví dụ - để trích xuất kết quả t-test cho độ tuổi, bạn có thể sử dụng

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05 như thế này:

# There is no "container" in this example

6

# There is no "container" in this example

3

Lập chỉ mục các cấp độ sâu hơn bằng cách chỉ định các cấp độ cao hơn bằng dấu phẩy. Dưới đây trích xuất phần tử có tên “p.value” từ danh sách

# import the linelist linelist <- import("linelist_cleaned.rds")

01 trong danh sách

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

76. Bạn cũng có thể sử dụng số thay vì tên ký tự.

# There is no "container" in this example

8

# There is no "container" in this example

9

Bạn có thể trích xuất các phần tử bên trong như vậy từ tất cả các phần tử cấp một bằng cách sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29 để chạy hàm

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05 trên từng phần tử cấp một. Ví dụ, đoạn mã dưới đây trích xuất các phần tử “p.value” từ tất cả các danh sách trong

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

76. Danh sách các kết quả t-test là

# import the linelist linelist <- import("linelist_cleaned.rds")

35 được lặp qua,

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05 là hàm

# import the linelist linelist <- import("linelist_cleaned.rds")

33 đang được lặp và giá trị “p-value” được cung cấp cho hàm.

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

0

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

1

Một cách thay thế khác là

# import the linelist linelist <- import("linelist_cleaned.rds")

29 viết tắt tên phần tử trong dấu ngoặc kép và nó sẽ ngắt nó ra. Nếu bạn sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29, đầu ra sẽ là một danh sách, trong khi nếu bạn sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

54 thì nó sẽ là một vectơ ký tự được đặt tên và nếu bạn sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

55 nó sẽ là một vector số được đặt tên.

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

2

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

3

Bạn có thể đọc thêm về

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

05 trong tài liệu về purrr. Nó có một hàm tương tự là

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

22 sẽ trả về lỗi thay vì NULL nếu một phần tử không tồn tại.

Chuyển đổi danh sách thành data frame

Đây là một nội dung phức tạp - hãy xem phần Tài nguyên học liệu để có các hướng dẫn đầy đủ hơn. Tuy nhiên, chúng tôi sẽ minh họa việc chuyển đổi danh sách các kết quả t-test thành một data frame. Chúng tôi sẽ tạo một data frame với các cột cho biến, p-value của nó và giá trị trung bình từ hai nhóm (nam và nữ).

Dưới đây là một số phương pháp và hàm mới sẽ được sử dụng:

  • Hàm

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    23 sẽ được sử dụng để tạo một tibble (giống như một data frame)

    • Chúng tôi bao quanh hàm

      [1] 3

      [1] 4

      [1] 5

      [1] 6

      [1] 7

      23 bằng dấu ngoặc nhọn

      [1] 3

      [1] 4

      [1] 5

      [1] 6

      [1] 7

      25 để ngăn toàn bộ

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"
      76 được lưu trữ dưới dạng cột nhỏ đầu tiên
  • Trong

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    23, mỗi cột được tạo một cách rõ ràng, tương tự như cú pháp của

    for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

    91:

    • Dấu

      import the linelist

      linelist <- import("linelist_cleaned.rds")

      44 đại diện cho

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"
      76
    • Để tạo một cột với các tên biến t-test (tên của mỗi phần tử danh sách), chúng tôi sử dụng

      a 'for loop' with character sequence

      for (hosp in hospital_names){ # sequence
            # OPERATIONS HERE  
       }  
      
      6 như đã mô tả ở trên
    • Để tạo một cột với các p-values, chúng tôi sử dụng

      import the linelist

      linelist <- import("linelist_cleaned.rds")

      55 như được mô tả ở trên để kéo các phần tử

      for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{"
       [print](https://rdrr.io/r/base/print.html)(num + 2)             # The OPERATIONS (add two to each sequence number and print)  
      
      } # The loop is closed with "}"
      85 và chuyển đổi chúng thành một vector số

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

4

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

5

Nhưng bây giờ hãy thêm các cột chứa trung bình cho mỗi nhóm (nam và nữ).

Chúng tôi sẽ cần trích xuất phần tử

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

88, nhưng điều này thực sự chứa hai phần tử bên trong nó (

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

89 và

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

90). Vì vậy, nó không thể được đơn giản hóa thành một vector với

# import the linelist linelist <- import("linelist_cleaned.rds")

54 hoặc

# import the linelist linelist <- import("linelist_cleaned.rds")

55. Thay vào đó, chúng tôi sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

29, được sử dụng trong

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

23, sẽ tạo một cột lớp danh sách trong tibble! Vâng, điều này là có thể!

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

6

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

7

Sau khi bạn có cột danh sách này, có một số hàm tidyr (một phần của tidyverse) giúp bạn “gỡ rối” hoặc “gỡ bỏ” các cột “danh sách lồng nhau” này. Đọc thêm về chúng tại đây hoặc bằng cách chạy

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

41. Tóm lại:

  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    42 - đưa mỗi phần tử của mỗi danh sách cột một cột riêng của nó
  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    43 - đưa mỗi phần tử của mỗi danh sách cột một hàng riêng của nó
  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    44 - hoạt động giống như

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    42 nhưng bạn chỉ định phần tử nào cần gỡ bỏ

Dưới đây, chúng tôi chuyển tibble sang

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

42 để chỉ định cột

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

47 của tibble (là một danh sách lồng nhau). Kết quả là

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

47 được thay thế bằng hai cột mới, mỗi cột phản ánh hai phần tử trước đó trong mỗi ô

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

47.

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

8

# make vector of the hospital names hospital_names <- unique(linelist$hospital) hospital_names # print

9

Loại bỏ, giữ lại và thu gọn danh sách

Vì làm việc với purrr nên thường liên quan đến danh sách, chúng ta sẽ khám phá ngắn gọn một số hàm purrr để sửa đổi danh sách. Xem phần Tài nguyên học liệu để có hướng dẫn đầy đủ hơn về các hàm purrr.

  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    50 có nhiều cách sử dụng, một trong số đó có thể là xóa một phần tử danh sách
  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    51 giữ lại các phần tử được chỉ định cho

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    52 hoặc trong đó một hàm được cung cấp cho

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    52 đánh giá là TRUE
  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    54 loại bỏ các phần tử được chỉ định cho

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    55 hoặc trong đó một hàm được cung cấp cho

    [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    52 đánh giá là TRUE
  • [1] 3

    [1] 4

    [1] 5

    [1] 6

    [1] 7

    57 loại bỏ tất cả các phần tử trống

Dưới đây là một số ví dụ sử dụng danh sách

# import the linelist linelist <- import("linelist_cleaned.rds")

78 được tạo trong phần trên về (nó chứa 6 trường hợp linelist thuộc data frames):

Các phần tử có thể được xóa bằng tên với

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

50 và đặt tên bằng

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

60.

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

0

Bạn cũng có thể loại bỏ các phần tử theo tiêu chí, bằng cách cung cấp phương trình “định trước” cho

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

52 (một phương trình đánh giá là TRUE hoặc FALSE). Đặt dấu ngã

# import the linelist linelist <- import("linelist_cleaned.rds")

37 trước hàm và sử dụng

# import the linelist linelist <- import("linelist_cleaned.rds")

35 để đại diện cho phần tử danh sách. Sử dụng

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

51, các phần tử danh sách đánh giá là TRUE sẽ được giữ lại. Ngược lại, nếu sử dụng

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

54, các phần tử danh sách đánh giá là TRUE sẽ bị loại bỏ.

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

1

Trong ví dụ dưới đây, các phần tử danh sách bị loại bỏ nếu lớp của chúng không phải là data frames.

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

2

Hàm định trước của bạn cũng có thể tham chiếu các phần tử/cột trong mỗi mục danh sách. Ví dụ, bên dưới, liệt kê các phần tử có giá trị trung bình của cột

for (num in c(1,2,3,4,5)) { # the SEQUENCE is defined (numbers 1 to 5) and loop is opened with "{" print(num + 2) # The OPERATIONS (add two to each sequence number and print) } # The loop is closed with "}"

81 trên 25 sẽ bị loại bỏ.

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

3

Lệnh này sẽ xóa tất cả các phần tử danh sách trống:

## [1] "Other"                                "Missing"                              "St. Mark's Maternity Hospital (SMMH)"
## [4] "Port Hospital"                        "Military Hospital"                    "Central Hospital"

4

## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7

67

PHẦN NÀY ĐANG ĐƯỢC XÂY DỰNG

Các hàm apply

Nhóm hàm “apply” là một hàm R base thay thế cho purrr với các thao tác lặp lại. Bạn có thể đọc thêm về chúng tại đây.