-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04_preprocess.Rmd
281 lines (191 loc) · 5.37 KB
/
04_preprocess.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# データ編集
- サンプルデータで実行例を示す
## 列の追加
### mutate
- https://kazutan.github.io/kazutanR/hands_on_170730/mutate.html
```{r mutate}
drug2 <- mutate(drug, dose_amount_2 = dose_amount * 2)
drug2
```
### add_column
- 指定の位置に列を追加
```{r add_column}
drug %>%
add_column(new_var = "value", .before = "id")
```
### 複数の列から最大や最小を求める
- maxやminは基本列方向にしか働かないためrowwiseを使う
- よりよい書き方ありますか?
```{r rowwise}
df <- disease %>%
rename(date_dis = date) %>% # 列名重複を避ける為に変更しておく
inner_join(drug, "id") %>% # 結合
rowwise() %>%
mutate(date_max = max(date, date_dis, na.rm = TRUE)) # NAは除外
```
### 条件分岐
- if_else()
- case_when()
### ビニング
```{r}
# mutate(bmigp = case_when(bmi < 25 ~ 1, 25 <= bmi & bmi < 30 ~ 2, 30 <= bmi ~ 3))
# mutate(bmigp=cut(bmi, c(0, 25, 30, 40), labels=c(“nwt”, “owt”, “obese”), LEFT =FALSE))
```
### 1行ずらす
- lag()
- lead()
## 列の編集
### mutate
- mutateで既存の列を指定すれば上書きになる
```{r mutate_same_col}
drug2 <- mutate(drug, dose_amount = as.character(dose_amount))
```
### mutate, across
- 制作中
## 列の選択
- selectを使う
- 列番号または列名による指定が可能
```{r select}
drug2 <- drug %>%
select(1, 3)
drug2 <- drug %>%
select(id, atccode)
```
## 列の削除
- selectで「!」を使うと削除になる
- 列番号または列名による指定が可能
```{r remove}
drug2 <- drug %>%
select(!2, !4)
drug2 <- drug %>%
select(!id, !atccode)
```
### 列名が重複してる場合
- 列名が重複してるデータをもらった場合、select等で列名を指定することができない
- `tibble::repair_names()`を使うと列名の重複を解消してくれる
## 列の入替
- 列番号または列名による指定が可能
```{r replace3}
patient2 <- patient %>%
select(2, 3, 1)
patient2 <- patient %>%
select(gender, start_date, id)
```
## 列名関連
## 列名確認
```{r colnames}
colnames(patient)
```
### 一部変更
```{r rename}
patient2 <- patient %>%
rename(patientid = id)
```
### 全体変更
```{r set_colnames}
patient2 <- patient %>%
set_colnames(c("col1", "col2", "col3"))
```
## 列の作成・選択・入替・名前変更を一括で
- transmuteを使うと上記の作業を一行で書くことができる
```{r transmute}
patient2 <- patient %>%
transmute(gender, patientid = id)
```
## 並べ替え
- 複数の列をキーにして並べ替えることもできる
```{r arrange}
patient2 <- patient %>%
arrange(start_date)
```
## 条件によるフィルタ
```{r filter}
# idが1の患者み
patient2 <- patient %>%
filter(id == 1)
# idが5以下の患者のみ
patient2 <- patient %>%
filter(id <= 5)
# genderがMの患者のみ
patient2 <- patient %>%
filter(gender == "M")
```
## その人のx番目の行を取得
- row_number()を使う
```{r}
disease2 <- disease %>%
group_by(id) %>%
filter(row_number() == 2) %>% # ここの数字を変えてx番目の行を取得
ungroup()
```
## その人の上からx番目の行を取得
- `row_number()`の例を不等号に変えればできるが、`top_n()`の例を示す
```{r}
disease2 <- disease %>%
group_by(id) %>%
top_n(2, date) %>% # ここの数字を変えて1~x番目の行を取得
ungroup()
```
## 特定のデータフレームの列に含まれる行を抽出
- `filter`と`%in%`か、`semi_join`を使う
```{r semi_join}
# 一例としてデータフレームを作成する
df <- data.frame(id = c(1, 3, 5), var = c("a", "b", "c"))
patient2 <- filter(patient, id %in% df$id)
patient2 <- semi_join(patient, df, "id")
```
## 特定のデータフレームの列に含まれない行を抽出
- `filter`と`%in%`か、`anti_join`を使う
```{r anti_join}
# 一例としてデータフレームを作成する
df <- data.frame(id = c(1, 3, 5), var = c("a", "b", "c"))
patient2 <- filter(patient, !(id %in% df$id))
patient2 <- anti_join(patient, df, "id")
```
## 重複削除
- 初回処方日や初診断月の特定に用いることが多い
### distinct
```{r distinct}
drug2 <- drug %>%
distinct(id, .keep_all = TRUE)
```
### first
```{r first}
drug2 <- drug %>%
group_by(id) %>%
first() %>%
ungroup()
```
## データを縦に結合
```{r bind_rows}
patient2 <- bind_rows(patient, patient)
```
## データを横に結合
```{r bind_cols}
patient2 <- bind_cols(patient, patient)
```
## マッチしたデータを横に結合
- 基本的にleft_joinとinner_joinが使えればOK
- 使い分けについては以下URLなどを参考に
- https://qiita.com/matsuou1/items/b1bd9778610e3a586e71
```{r left_join}
df <- left_join(patient, disease, "id")
```
```{r inner_join}
df <- inner_join(patient, disease, "id")
```
- 2つのデータで同名の列があると接尾に「.x」と「.y」がつくが、suffixを使うと自分で指定できる
```{r}
df <- inner_join(drug, disease, "id", suffix = c("_drug", "_disease"))
```
## 部分一致
### 文字列一致判定
- str_detect()
### 文字列置換
- str_replace(), str_replace_all()
- https://qiita.com/kazutan/items/0b690961d4516e48f6c0
### 文字列削除
- str_remove()
## 正規表現
## 欠損値
- https://qiita.com/five-dots/items/361a42baf1e94edf5846