Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的条件重编码_R - Fatal编程技术网

R中的条件重编码

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

我从2007-2017年有十个性别变量(
gender1
gender2
,…,
gender17

我想创建一个与最新性别记录相等的
总体性别
变量

理想情况下,我希望使用这样一个循环:if
gender17=“N/a”
,use
gender16
,if
gender16!=“不适用”
;等等

例如:

       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与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)])

如果要在长格式数据集中维护信息(原始表中的所有信息,除了未列出
NA
之外),可以使用
mutate()
而不是
summary()
)。但是如果您这样做,请确保立即将结果导入
ungroup()

dplyr
包中的函数值得一试,前提是
中的“N/a”
值实际上被编码为
NA
是否可以查找是否存在M或F?性别不应该因个人而改变,对吗?性别可能会随时间而改变。否则,我会将每个人的性别进行融合和聚合。请提供一个小的、可复制的例子。