【问题标题】:How to manipulate a data where if a variable gives an output the succeeding variable must give the same output?如何操作数据,如果变量给出输出,则后续变量必须给出相同的输出?
【发布时间】:2018-12-16 23:29:28
【问题描述】:

如何操作数据集,如果一个变量给出某个输出,那么后续变量必须给出相同的输出?

我们认为 VAR1_2013VAR1_2014 属于同一变量,分别在 2013 年和 2014 年测量。 VAR2_2013VAR2_2014 是另一组变量,也分别在 2013 年和 2014 年测量。 我想写一个代码,如果早期的测量,即VAR1_2013VAR2_2013被记录为“YES”,那么后续的测量也必须是“YES”。否则,我们将保持原样。

问题是我有 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

【问题讨论】:

  • 列名是否总是由“something”后跟一个数字后跟“_YYYY”组成?
  • 您好,通常是变量名后跟“_YYYY”。所以,“STROKE_2013”​​、“STROKE_2014”...“STROKE_2018”
  • 看看我的回答能否解决问题。我已经对其进行了编辑以更改第一个变量之后的几个变量。

标签: r dplyr data-manipulation tidyr purrr


【解决方案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

【讨论】:

  • 您好,感谢您的回答,我实际上希望只有在前一年有“是”的情况下才能对随后的年份进行更改。所以,如果有“不”,我们就保持这种状态。与第 2 行一样,最后一列应该是“是”。
  • @HNSKD 完成,将代码行更改为 is.na,其他一切都保持不变。
猜你喜欢
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多