2017-11-07 25 views
0

2007-2017gender1,、...、gender17)のジェンダー変数があります。の条件付きコードR

overall_genderという変数を最新の性別レコードと同じにしたいと考えています。

理想的には、次のようなループを使用したいと考えています。gender17 = "N/A"の場合、gender16を使用してください。gender16 != "N/A";等々。例えば

 ID y1 y2 y3 y4 y5 y6 y7 y8 y9 y10 
1 person1 M M M M M M M M M NA 
2 person2 M M M M NA NA NA NA NA NA 
3 person3 F F F F F F NA NA NA NA 
4 person4 M M M M F F F NA NA NA 

所望の出力:

 ID Gender 
1 person1  M 
2 person2  M 
3 person3  F 
4 person4  F 

これを行う方法上の任意のアイデア?

+1

__'dplyr'__パッケージの['coalesce'](https://www.rdocumentation.org/packages/dplyr/versions/0.7.3/topics/coalesce)機能は試してみる価値があります「N/A」値が実際には「NA」としてコード化されていることを意味します。 – bouncyball

+0

MまたはFの存在を探してください。性別は人によって変わるべきではないのですか? – leeum

+0

性別が時間外に変化する可能性があります。それ以外の場合は、私は人それぞれの性別を融解して集計します。 – user8901221

答えて

1

最新の非NA値

#example data 
df <- data.frame(Gender1=c("M","F"),Gender2=c("M","M"), 
       Gender3=c(NA,"M"),Gender4=c(NA,NA),stringsAsFactors = FALSE) 

df$overall_gender <- apply(df,1,function(x) tail(x[!is.na(x)],1)) 

df 

    Gender1 Gender2 Gender3 Gender4 overall_gender 
1  M  M <NA>  NA    M 
2  F  M  M  NA    M 
0

tidyr + dplyrで識別するためにtailis.naを使用して、このような何かを行うことができます:

library(dplyr) 
library(tidyr) 

bind_cols(df, df %>% 
    gather(variable, Gender, -ID) %>% 
    na.omit() %>% 
    arrange(ID, variable) %>% 
    group_by(ID) %>% 
    slice(n())) %>% 
    select(-variable, -ID1) 

結果:

 ID y1 y2 y3 y4 y5 y6 y7 y8 y9 y10 Gender 
1 person1 M M M M M M M M M NA  M 
2 person2 M M M M <NA> <NA> <NA> <NA> <NA> NA  M 
3 person3 F F F F F F <NA> <NA> <NA> NA  F 
4 person4 M M M M F F F <NA> <NA> NA  F 

データ:ここ

df = read.table(text = "  ID y1 y2 y3 y4 y5 y6 y7 y8 y9 y10 
       1 person1 M M M M M M M M M NA 
       2 person2 M M M M NA NA NA NA NA NA 
       3 person3 F F F F F F NA NA NA NA 
       4 person4 M M M M F F F NA NA NA", header = TRUE) 
0

は、列名は、常に*数と形"y*"を持っているだろうと仮定して、かなりコンパクトなソリューションです:

library("dplyr") 

# where `dat` is the table in the post: 
dat %>% 
    reshape2::melt(id.vars="ID") %>% 
    filter(!is.na(value)) %>% 
    mutate(variable = as.numeric(gsub("y", "", as.character(variable)))) %>% 
    group_by(ID) %>% 
    summarize(gender = value[variable==max(variable)]) 

あなたはmutate()代わりのsummarize()場合を使用することができます長い形式のデータセット(元のテーブルのすべての情報、NAのリストは除きます)の情報を維持したいとします。しかし、あなたがそれを行うならば、結果をungroup()の直後にパイプしてください!