1. 目的
- 特定の列(変数)について条件を満たす行(観測)の更新
2. コード
2.1 データフレームdfを生成
- 行(観測)×列(変数)=4×2のdf
v1 <- c("A", "B", "C", "D")
v2 <- c(0, 0, 1, 1)
df <- data.frame(v1, v2)
df
- 出力:
v1 v2
1 A 0
2 B 0
3 C 1
4 D 1
2-2.dfの更新
- 更新内容:v2 > 0の行について,v2に-1を加える
- 方針:
- 更新した行を抜き出し保存(df_updateとする)
- 更新しない行を保存(df, df_updateのうちdfにしかない行,dplyr::anti_join()を使う)
- 更新しない行に更新した行をくっつける(dplyr::bind_rows()を使う)
df_update <- df %>%
dplyr::filter(v2>0) %>%
dplyr::mutate(v2=v2-1)
df <- df %>%
dplyr::anti_join(df_update, by="v1") %>%
dplyr::bind_rows(df_update)
df
- 出力:
v1 v2
1 A 0
2 B 0
3 C 0
4 D 0
2.3 応用例
- 行(観測)×列(変数)=4×3のdfとする.
v1 <- c("A", "B", "C", "D")
v2 <- c(0, 0, 1, 5)
v3 <- rep(0,4)
df <- data.frame(v1, v2, v3)
df
- 出力:
v1 v2 v3
1 A 0 0
2 B 0 0
3 C 1 0
4 D 5 0
- 更新内容:
- v2 > 0の行について,v2に-0.1を加える
- v2の合計値が0を超えている間は,繰り返しv2 > 0の行についてv2に-0.1を加え続ける
- -0.1を加えた回数をv3に格納
- (10^-2のオーダーは誤差として丸める)
v2_sum <- sum(unlist(df$v2))
library(dplyr)
while (v2_sum>0) {
df_update <- df %>%
dplyr::filter(v2>0) %>%
dplyr::mutate(v2=round(v2-0.1, 2), v3=v3+1)
df <- df %>%
dplyr::anti_join(df_update, by="v1") %>%
dplyr::bind_rows(df_update)
v2_sum <- sum(unlist(df$v2))
}
df
- 出力:
v1 v2 v3
1 A 0 0
2 B 0 0
3 C 0 10
4 D 0 50
3. コメント
- 使いどころ:特定の変数について条件を満たす観測に「複雑な処理」を施し,条件を満たすまで繰り返した結果を格納するときとか
- いちいちバインドするので遅い