2017-11-08 23 views
-1

以下のベクトルを編集する最も簡単な方法を検討しています。私はAとBの値をNAとのテスト値< 2(0または1)に置き換え、テスト列を削除したいと思います。私は条件付きで置き換えることができますが、この例ははるかに大きなデータフレームから問題を説明することです。R最適条件付き編集

> df <- data.frame(list(A=c(100, 30, 200, 80, 5), B=c(12, 40, 100,70,50), testA=c(17, 1, 120,400,70), testB=c(5, 4, 1, 10, 0))) 

それは次のようになります。

A B testA testB 
100 12 17 5 
30 40 1 4 
200 100 120 1 
80 70 400 10 
    5 50 70 0 

それは次のようになります。

A B 
100 12 
NA 40 
200 NA 
80 70 
    5 NA 

は、事前にありがとうございます!

+0

条件付きで値を置き換えるにはいくつかの方法があります:https://stackoverflow.com/a/41585689/5088194 –

答えて

0

@ Jens Leerssenのように、たくさんの方法があります。私が見ることができる最も簡単な方法は、各列に条件付きを置くことです。あなたは、それを拡張したい使用している場合*適用するか、forループ:

with(df, ifelse(testA < 2, NA, A)) 

ないように注意してくださいどのくらいのデータyoureのを扱うが、これは私のボックス(OSX、16ギガバイト、I5)で動作します:

df <- data.frame(list(A=c(100, 30, 200, 80, 5), B=c(12, 40, 100,70,50), testA=c(17, 1, 120,400,70), testB=c(5, 4, 1, 10, 0))) 

# create two vectors, one for each set of columns 
vec_nam = names(df) 
vec_split = tolower(grepl('^test.*', vec_nam)) # tolower() to avoid conflict with TRUE/FALSE 
list_df = split(vec_nam, vec_split) 

num_comparisons = length(list_df$false) 
list_return = vector('list', length = num_comparisons) 

for (i in 1:num_comparisons){ 
    col_test = list_df$true[i] 
    col_valu = list_df$false[i] 

    list_return[[i]] = ifelse(df[, col_test] < 2, NA, df[, col_valu]) 
} 

final_df = setNames(do.call(cbind.data.frame, list_return), list_df$false) 
+0

ありがとうございます。しかし、実際にはループを探しています。 。また、メモリの使用率は重要なので –

+0

ですので、複数の列のペアを使用することを検討していますか? testZ、Z、Nが必要です。ここでtestZ <= Nの場合はNA、そうでない場合はZ?メモリが不安な場合は、新しいベクトル/ df列を作成する代わりに、関数が列を置き換えます。 – bringtheheat

+0

それは私が扱っている問題です。私は問題に取り組む方法を考えましたが、新しいベクトルを作成することで、あまり効率的ではありません。 –

0
> df2 <- data.frame(A= with(df, ifelse(df$testA < 2, NA, df$A)), B= with(df, ifelse(df$testB < 2, NA, df$B))) 

これは与えられた例では機能しますが、スケーリングすることも不可能です。私はそれはeffiecientダブト。