我有数据显示5个测试(pub1
至pub5
)的结果,每个结果取0到6之间的整数值,并在5个不同年龄段(age1
至{{ 1}})。也就是说,age5
是在pub1
完成的。...age1
是在pub5
完成的
我需要创建6个新的列/变量(age5
至age_v1
),这些列/变量应显示某人首次获得特定得分age_v6
的年龄:
pub
变量上首次出现值1的年龄pub
变量上首次出现值2的年龄pub
变量上首次出现值3的年龄pub
变量上首次出现4的年龄pub
变量上首次出现5的年龄pub
变量上首次出现6的年龄例如,对于单个x,如果pub
第一次在age_v5
中的任何一个age3
变量上得分为5,则等于pub
< / p>
pub3
答案 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))]
})