我有几次严重的变量,我想创建两个新的虚拟变量。 变量一:如果其他变量包含特定值,则变量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
提前致谢
答案 0 :(得分:0)
一个选项是循环遍历行,查找是否有output
c
af
as
值为96('x1'),对每行进行游程编码,检查是否有{{1 '{1}}对于'TRUE'值大于1('x2'),连接两者,转置并将两个新列分配给输出。
any
或另一种选择是使用any
lengths
答案 1 :(得分:0)
如果你愿意的话,你可以对data.table
做一些幻想。使用长格式,融化的数据集可能会使某些比较的逻辑变得更简单。
library(data.table)
setDT(dat)
melt(dat, id="ID")[, .(with96=any(value==96), b2b96=any(diff(which(value==96))==1)), by=ID]
# ID with96 b2b96
#1: 1 TRUE TRUE
#2: 2 FALSE FALSE
#3: 3 TRUE FALSE
#4: 4 FALSE FALSE
#5: 5 TRUE FALSE