[英]Conditional recode in R
我有從2007-2017
gender1
十個性別變量( gender1
, gender2
,..., gender17
)。
我想創建一個與最近的性別記錄相等的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
有關如何執行此操作的任何想法?
您可以執行以下操作,使用tail
和is.na
識別最新的非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
使用dplyr
+ tidyr
:
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)
這是一個相當緊湊的解決方案,假設列名將始終采用帶數字*
的"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()
!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.