通过重复测量生成多个变量的功能

时间:2018-07-12 15:41:22

标签: r functional-programming dplyr data-manipulation

我有数据显示5个测试(pub1pub5)的结果,每个结果取0到6之间的整数值,并在5个不同年龄段(age1至{{ 1}})。也就是说,age5是在pub1完成的。...age1是在pub5完成的

我需要创建6个新的列/变量(age5age_v1),这些列/变量应显示某人首次获得特定得分age_v6的年龄:

  1. age_v1:在任何pub变量上首次出现值1的年龄
  2. age_v2:在任何pub变量上首次出现值2的年龄
  3. age_v3:在任何pub变量上首次出现值3的年龄
  4. age_v4:在任何pub变量上首次出现4的年龄
  5. age_v5:在任何pub变量上首次出现5的年龄
  6. age_v6:在任何pub变量上首次出现6的年龄

例如,对于单个x,如果pub第一次在age_v5中的任何一个age3变量上得分为5,则等于pub < / p>

pub3

1 个答案:

答案 0 :(得分:1)

我们可以更轻松地创建数据,而无需执行许多步骤

i1 <- grepl('^pub', names(data)) # index for pub columns
i2 <- grepl('^age', names(data)) # index for age columns
data[i1] <- lapply(data[i1], function(x) pmax(round(., 0), 0)) # data rounding
# instead of NA values, replaced with 0 as it is easier to get the column index

list中以1:6循环,提取与first匹配项对应的列索引,该匹配项与'pub'每行cbind中具有行索引的值并提取相应的“年龄”值。如果一行中没有匹配项,则为NA(使用'j2'索引),然后将其分配以在'data'中创建新列

data[paste0("age_v", 1:6)] <- lapply(1:6, function(i) {
         j1 <- max.col(data[i1] == i, 'first')
         j2 <- rowSums(data[i1] == i) == 0
         data[i2][cbind(seq_len(nrow(data)), j1 *(NA^j2))]
  })