如果变量提供输出,随后的变量必须提供相同的输出,该如何处理数据呢?

时间:2018-07-09 10:02:54

标签: r dplyr data-manipulation tidyr purrr

如何操作数据集,以便如果变量提供特定输出,则后续变量必须提供相同输出?

我们认为VAR1_2013VAR1_2014属于同一变量,分别在2013年和2014年测得。 VAR2_2013VAR2_2014是另一组变量,也分别在2013年和2014年进行了度量。 我想编写一个代码,使得如果较早的度量(即VAR1_2013VAR2_2013记录为“是”,则随后的测量也必须为“是”)。否则,我们将其保留不变。

问题是我有6个变量x 6年,这意味着要操作36个变量。

数据:

df <- read.table(text ="
                 ID VAR1_2013 VAR2_2013 VAR1_2014 VAR2_2014
                 1 YES NO NO NO
                 2 NO NO NO YES
                 3 NA YES NO NO
                 4 NO YES NA NA", header = TRUE, stringsAsFactors = FALSE)

我运行了以下代码,但显然,它不可伸缩。

代码:

library(dplyr)
df %>% 
  mutate(VAR1_2014 = if_else(!is.na(VAR1_2013) & VAR1_2013 == "YES", "YES", VAR1_2014),
         VAR2_2014 = if_else(!is.na(VAR2_2013) & VAR2_2013 == "YES", "YES", VAR2_2014))
# ID VAR1_2013 VAR2_2013 VAR1_2014 VAR2_2014
# 1  1       YES        NO       YES        NO
# 2  2        NO        NO        NO       YES
# 3  3      <NA>       YES        NO       YES
# 4  4        NO       YES      <NA>       YES

1 个答案:

答案 0 :(得分:1)

我相信以下内容可以满足您的需求并且可以扩展。

nm <- names(df)[-1]
vr <- unique(sapply(strsplit(nm, "_"), '[[', 1))
for(v in vr){
  s <- grep(v, nm, value = TRUE)
  i <- !is.na(df[[ s[1] ]]) & df[[ s[1] ]] == "YES"
  df[[ s[-1] ]][i] <- df[[ s[1] ]][i]
}

df
#  ID VAR1_2013 VAR2_2013 VAR1_2014 VAR2_2014
#1  1       YES        NO       YES        NO
#2  2        NO        NO        NO       YES
#3  3      <NA>       YES        NO       YES
#4  4        NO       YES      <NA>       YES