在列表

时间:2017-04-28 21:41:18

标签: r if-statement

我刚刚过渡到使用SAS的R,我正在处理一个非常大的数据集(50万个观测值和2万个变量),这需要相当多的重新编码。我想这是一个非常基本的问题,但我还在学习,所以我真的很感激任何指导!

许多变量有三个实例,每个实例都有多个数组。对于这个问题,我正在使用“父亲病史”。包括许多疾病,但我主要对CAD感兴趣(编码为“1”)。

数据外观的一个示例:

n_20107_0_0   n_20107_0_1     n_20107_0_2
    NA             NA              NA
    7             1                8
    4             6                1             

我这里只包含了3个数组,但实际上接近20个。我做了一些研究并确定最有效的方法是创建一个包含变量的列表然后使用lapply 。这就是我的尝试:

 FatherDisease1 <- paste("n_20107_0_", 0:3, sep = "")
lapply(FatherDisease1, transform, FatherCAD_0_0 = ifelse(FatherDisease1 == 1, 1, 0))

当我这样做时,我找不到我想要的结果。

 n_20107_0_0   n_20107_0_1     n_20107_0_2  FatherCAD_0_0
   NA             NA              NA             0
    7             1                8             0
    4             6                1             0

我想要做的是通过所有3个实例,如果这个人回答了1,那么“FatherCAD_0_0”等于1,如果没有,那么“FatherCAD_0_0”等于0,但我只是最终得到了0。至于NA,我希望他们留下作为NA。 这就是我希望它看起来像:

n_20107_0_0   n_20107_0_1     n_20107_0_2  FatherCAD_0_0
   NA             NA              NA            NA
    7             1                8             1
    4             6                1             1

我已经想出了如何以“长”的方式(30多行代码-_-)这样做,但我正在努力改进编写更优雅和高效的代码。任何帮助将不胜感激!!

1 个答案:

答案 0 :(得分:1)

假设您的数据位于data.frame,您可以使用apply循环遍历每一行并检查您感兴趣的任何列是否有1:

FatherDisease1 <- paste("n_20107_0_", 0:2, sep = "")
df$FatherCAD_0_0 <- apply(df, 1, function(x) as.integer(any(x[FatherDisease1] == 1)))

df
#  n_20107_0_0 n_20107_0_1 n_20107_0_2 FatherCAD_0_0
#1          NA          NA          NA            NA
#2           7           1           8             1
#3           4           6           1             1

数据:

df <- structure(list(n_20107_0_0 = c(NA, 7L, 4L), n_20107_0_1 = c(NA, 
1L, 6L), n_20107_0_2 = c(NA, 8L, 1L)), .Names = c("n_20107_0_0", 
"n_20107_0_1", "n_20107_0_2"), row.names = c(NA, -3L), class = "data.frame")