2017-09-11 8 views
3

他の列のいずれかに現在の値があるかどうかに基づいてデータフレーム列を作成したいとします。R-他の列の現在の値に基づく新しい列

例:列cは、残りの行に現在の値があるかどうかによって作成されました。 cは次のコードビットを使用して作成された

age bmi hyp chl c 
1 1 NA NA NA NA 
2 2 22.7 1 187 1 
3 1 NA 1 187 1 
4 3 NA NA NA NA 
5 1 20.4 1 113 1 
6 3 NA NA 184 1 
7 1 22.5 1 118 1 
8 1 30.1 1 187 1 
9 2 22.0 1 238 1 
10 2 NA NA NA NA 
11 1 NA NA NA NA 
12 2 NA NA NA NA 
13 3 21.7 1 206 1 
14 2 28.7 2 204 1 
15 1 29.6 1 NA 1 
16 1 NA NA NA NA 
17 3 27.2 2 284 1 
18 2 26.3 2 199 1 
19 1 35.3 1 218 1 
20 3 25.5 2 NA 1 
21 1 NA NA NA NA 
22 1 33.2 1 229 1 
23 1 27.5 1 131 1 
24 3 24.9 1 NA 1 
25 2 27.4 1 186 1 

は、カラム:

df <- transform(df, c=ifelse(!(is.na(bmi)) | !(is.na(hyp)) | !(is.na(chl)),1,NA)) 

私の質問は:どのように私は列を指定せずに上記を行う関数を作成することができます。つまり、45列のデータセットがある場合は、ifelseステートメントですべての名前を指定する必要はありません。

事前に感謝します。

答えて

3

私たちは論理的マトリックス上rowSumsを使用して、我々はまた、dplyrパッケージから​​3210機能を使用することができNAのvectorと1

df$c <- NA^!rowSums(!is.na(df[-1])) 
df$c 
#[1] NA 1 1 NA 1 1 1 1 1 NA NA NA 1 1 1 NA 1 1 1 1 NA 1 1 1 1 
3

に変換することができます。

dt2 <- dt %>% 
    mutate_all(funs(as.numeric(.))) %>% 
    mutate(c = coalesce(.$bmi, .$hyp, .$chl)) %>% 
    mutate(c = ifelse(!is.na(c), 1, c)) 

dt2 
    age bmi hyp chl c 
1 1 NA NA NA NA 
2 2 22.7 1 187 1 
3 1 NA 1 187 1 
4 3 NA NA NA NA 
5 1 20.4 1 113 1 
6 3 NA NA 184 1 
7 1 22.5 1 118 1 
8 1 30.1 1 187 1 
9 2 22.0 1 238 1 
10 2 NA NA NA NA 
11 1 NA NA NA NA 
12 2 NA NA NA NA 
13 3 21.7 1 206 1 
14 2 28.7 2 204 1 
15 1 29.6 1 NA 1 
16 1 NA NA NA NA 
17 3 27.2 2 284 1 
18 2 26.3 2 199 1 
19 1 35.3 1 218 1 
20 3 25.5 2 NA 1 
21 1 NA NA NA NA 
22 1 33.2 1 229 1 
23 1 27.5 1 131 1 
24 3 24.9 1 NA 1 
25 2 27.4 1 186 1 

DATA

dt <- read.table(text = " age bmi hyp chl 
1 1 NA NA NA 
       2 2 22.7 1 187 
       3 1 NA 1 187 
       4 3 NA NA NA 
       5 1 20.4 1 113 
       6 3 NA NA 184 
       7 1 22.5 1 118 
       8 1 30.1 1 187 
       9 2 22.0 1 238 
       10 2 NA NA NA 
       11 1 NA NA NA 
       12 2 NA NA NA 
       13 3 21.7 1 206 
       14 2 28.7 2 204 
       15 1 29.6 1 NA 
       16 1 NA NA NA 
       17 3 27.2 2 284 
       18 2 26.3 2 199 
       19 1 35.3 1 218 
       20 3 25.5 2 NA 
       21 1 NA NA NA 
       22 1 33.2 1 229 
       23 1 27.5 1 131 
       24 3 24.9 1 NA 
       25 2 27.4 1 186", 
       header = TRUE, stringsAsFactors = FALSE) 
関連する問題