簡體   English   中英

R中的條件重新編碼

[英]Conditional recode in R

我有從2007-2017 gender1十個性別變量( gender1gender2 ,..., 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 

有關如何執行此操作的任何想法?

您可以執行以下操作,使用tailis.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM