0

次の形式の約 1M 行のテーブルがあるとします。

id  paid_2000  paid_2001  paid_2002  paid_2003  censor_yr
1   10         20         10         20         2001
2   15         25         15         15         2003

支払われた年が検閲年以上である場合に、各観測を NA に設定する効率的な方法は何でしょうか? 特に、テーブルを次のようにしたいと思います。

id  paid_2000  paid_2001  paid_2002  paid_2003  censor_yr
1   10         NA         NA         NA         2001
2   15         25         15         NA         2003
4

2 に答える 2

0

使用dplyr:

library(dplyr)
df %>%
  gather(paid_yr, value, grep("paid", names(.))) %>%
  mutate(value = ifelse(as.numeric(gsub(".*_", "", paid_yr)) >= censor_yr, 
                        NA, value)) %>%
  spread(paid_yr, value)

%>% select一番下にチェーンを投げcensor_yrて、最後まで戻ります。

必要に応じて、それがどのように機能するかを説明できます。akrunの回答よりも読みやすいかもしれませんし、そうでないかもしれません。

于 2016-12-17T18:17:04.923 に答える
0

「有料」(「pi」) の列のインデックスを作成し、「pi」を使用して列をサブセット化し、「有料」列の列名の年の部分文字列を「」の列名と比較して論理値のマトリックスを作成しますcensor_yr' 列を検索し、それを NA に割り当てます。

pi <- grep("paid", names(df1))
df1[pi][matrix(as.numeric(sub(".*_", "", names(df1)[pi]))[col(df1[pi])] >=
                       df1$censor_yr, nrow=2)] <- NA
df1
#   id paid_2000 paid_2001 paid_2002 paid_2003 censor_yr
#1  1        10        NA        NA        NA      2001
#2  2        15        25        15        NA      2003

または、data.table setより効率的な方法でこれを行うことができます。names「有料」列名から年の部分文字列を取得し、data.table( setDT(df1)) に変換し、「pi」の列をループしset、値を「i」の条件を満たす NA にします。

library(data.table)
nm1 <- as.numeric(sub(".*_", "", names(df1)[pi]))
setDT(df1)
for(j in seq_along(pi)){
   set(df1, i = which(nm1[j] >= df1$censor_yr), j= pi[j], value = NA)
}
于 2016-12-17T15:49:42.077 に答える