R中的条件重新编码

时间:2017-11-07 17:47:36

标签: r

我有2007-2017gender1gender2,...,gender17)的十个性别变量。

我想创建一个等于最新性别记录的 overall_gender 变量。

理想情况下,我想使用一个类似于:if gender17 = "N/A"的循环,使用gender16,if 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 

关于如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:1)

你可以这样做,使用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

答案 1 :(得分:0)

使用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)

答案 2 :(得分: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)])

如果要维护长格式数据集中的信息(原始表中的所有信息,除了未列出{{1}之外的信息),您可以使用mutate()代替summarize() }的)。但是如果你这样做,请确保将结果立即传递到NA