我有2007-2017
(gender1
,gender2
,...,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
关于如何做到这一点的任何想法?
答案 0 :(得分:1)
你可以这样做,使用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
答案 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
!