R中的条件重编码
我从2007-2017年有十个性别变量(R中的条件重编码,r,R,我从2007-2017年有十个性别变量(gender1,gender2,…,gender17) 我想创建一个与最新性别记录相等的总体性别变量 理想情况下,我希望使用这样一个循环:ifgender17=“N/a”,usegender16,ifgender16!=“不适用”;等等 例如: 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
gender1
,gender2
,…,gender17
)
我想创建一个与最新性别记录相等的总体性别
变量
理想情况下,我希望使用这样一个循环:ifgender17=“N/a”
,usegender16
,ifgender16!=“不适用”
;等等
例如:
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
#示例数据
df与dplyrtidyr
+
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)])
如果要在长格式数据集中维护信息(原始表中的所有信息,除了未列出NA
之外),可以使用mutate()
而不是summary()
)。但是如果您这样做,请确保立即将结果导入ungroup()
dplyr
包中的函数值得一试,前提是中的“N/a”
值实际上被编码为NA
是否可以查找是否存在M或F?性别不应该因个人而改变,对吗?性别可能会随时间而改变。否则,我会将每个人的性别进行融合和聚合。请提供一个小的、可复制的例子。