Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于在r中包含特定值的其他变量创建一个新变量_R_Variables - Fatal编程技术网

基于在r中包含特定值的其他变量创建一个新变量

基于在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

我有几个时间严重的变量,我想创建两个新的虚拟变量。 变量一:如果其他变量包含特定值,则变量一等于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         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列?