我有几个时间严重的变量,我想创建两个新的虚拟变量。变量一:如果其他变量包含特定值,则变量1等于1。变量二:如果其他变量连续包含特定值,则变量2等于1。
我的数据看起来像
ID score_2011 score_2012 score_2013 score_2014 score_2015
1 12 15 96 96 16
2 12 15 15 15 16
3 12 96 20 15 16
4 12 15 18 15 16
5 12 15 96 15 16
我想获得新的变量,如下所示
IF score_2011~2015 contain 96 then with_96=1
IF score_2011~2015 contain continuous 96 then back_to_back_96=1
我希望结果看起来像..
ID score_2011 score_2012 score_2013 score_2014 score_2015 with_96 back_to_back_96
1 12 15 96 96 16 1 1
2 12 15 15 15 16 0 0
3 12 96 20 15 16 1 0
4 12 15 18 15 16 0 0
5 96 15 96 15 16 1 0
提前致谢
一个办法是遍历行,寻找是否有any
是96的值(“X1”),请运行长度编码每个行,检查是否存在any
的lengths
对“真”的值大于1('x2'),将两者连接,转置并为输出分配两个新列。
df1[c("with_96", "back_to_back_96")] <- t(apply(df1[-1], 1, FUN= function(x) {
x1 <- as.integer(any(x==96))
rl <- rle(x==96)
x2 <- any(rl$lengths[rl$values]>1)
c(x1, x2)}))
df1
# ID score_2011 score_2012 score_2013 score_2014 score_2015 with_96 back_to_back_96
#1 1 12 15 96 96 16 1 1
#2 2 12 15 15 15 16 0 0
#3 3 12 96 20 15 16 1 0
#4 4 12 15 18 15 16 0 0
#5 5 12 15 96 15 16 1 0
或另一种选择是使用 rowSums
df1["with_96"] <- +(!!rowSums(df1[-1]==96))
df1["back_to_back_96"] <- rowSums((df1[-c(1, ncol(df1))]==96) +
(df1[-c(1,2)]==96)>1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句