基于在r中包含特定值的其他变量创建一个新变量
我有几个时间严重的变量,我想创建两个新的虚拟变量。 变量一:如果其他变量包含特定值,则变量一等于1。 变量2:如果其他变量连续包含特定值,则变量2等于1 我的数据看起来像基于在r中包含特定值的其他变量创建一个新变量,r,variables,R,Variables,我有几个时间严重的变量,我想创建两个新的虚拟变量。 变量一:如果其他变量包含特定值,则变量一等于1。 变量2:如果其他变量连续包含特定值,则变量2等于1 我的数据看起来像 ID score_2011 score_2012 score_2013 score_2014 score_2015 1 12 15 96 96 16 2 12 15 15 15
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
提前感谢一个选项是在行中循环,查找是否有
任何值为96('x1'),对每行进行运行长度编码,检查是否有任何的长度
,因为'TRUE'值大于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
一个选项是循环行,查找是否有any
值为96('x1'),对每行执行运行长度编码,检查是否有any
的长度,因为'TRUE'值大于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
如果你愿意的话,你可以对数据表做一些幻想。处理长格式的数据集可能会使其中一些比较的逻辑稍微简单一些
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
如果你愿意的话,你可以对数据表做一些幻想。处理长格式的数据集可能会使其中一些比较的逻辑稍微简单一些
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
谢谢因为数据框中还有其他变量,所以如何使用您的代码限制到第2列到第5列?谢谢。因为数据框中还有其他变量,所以如何使用您的代码限制到第2列到第5列?