0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【R tips】特定の列(変数)について条件を満たす行(観測)を更新する

Last updated at Posted at 2020-03-03

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. コメント

  • 使いどころ:特定の変数について条件を満たす観測に「複雑な処理」を施し,条件を満たすまで繰り返した結果を格納するときとか
  • いちいちバインドするので遅い

4. 参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?