2016-12-17 14 views
0

と仮定私は、次の形式の周り1M行のテーブルを持っている:支払った年がより大きいNAに各観測を設定するための効率的な方法だろう何 R編集データフレームの列の値に基づいて

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

または検閲の年に等しいか? 「パイ」を使用して列をサブセット、

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

答えて

0

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) 

がバックエンドにcensor_yrを移動するために底部に%>% select鎖を投げます。

あなたが望むなら、それがどのように機能するかを説明することができます。 akrunの回答よりも読みにくいかもしれません。

0

私たちは、「有給」されている列のインデックスを作成します(「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.tablesetでこれを行うことができます。 'pay'列名のnamesからdata.tablesetDT(df1))に変換し、 'pi'の列と 'set'の値を 'i'の条件を満たす値にループします。 dplyrを使用

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) 
} 
関連する問題