如何创建一个变量(捕捉特定阈值下的增长)R?

如何创建一个变量(捕捉特定阈值下的增长)R?,r,function,machine-learning,R,Function,Machine Learning,我有一个类似这样的数据集 Subject Year X Y A 1990 1 0 A 1991 1 0 A 1992 2 0 A 1993 3 1 A 1994 4 0 A 1995 4 0 B 1990 0 0

我有一个类似这样的数据集

    Subject  Year   X   Y   
        A   1990    1   0   
        A   1991    1   0   
        A   1992    2   0   
        A   1993    3   1   
        A   1994    4   0   
        A   1995    4   0   
        B   1990    0   0   
        B   1991    1   0   
        B   1992    1   0   
        B   1993    2   1   
        C   1991    1   0   
        C   1992    2   0   
        C   1993    3   0   
        C   1994    3   0   
        D   1991    1   0   
        D   1992    2   0   
        D   1993    3   0   
        D   1994    4   0   
        D   1995    5   0   
        D   1996    5   1   
        D   1997    6   0   
如何创建两个附加列,其中

  • 如果X增加,则A1为1,且受试者的最大值至少为4。否则为0。我尝试了
    data$a14)
    但是,这并不是我想要的
  • A2解释起来有点复杂,我不知道如何在R中执行它。但它基本上与A1的想法相同,这意味着它仍然应该捕获所有大于3的X。仅当Y=0时,在接下来的5年中,它应为=1。我给出了一个A2变量的示例。有可能在R中这样做吗?还是我需要手动执行此操作
结果:

            Subject  Year   X   A1   Y   A2
                A   1990    1    1   0    0
                A   1991    1    0   0    0
                A   1992    2    1   0    0
                A   1993    3    1   1    0
                A   1994    4    1   0    0
                A   1995    4    0   0    0
                B   1990    0    0   0    0
                B   1991    1    0   0    0
                B   1992    1    0   0    0 
                B   1993    2    0   1    0
                C   1991    1    0   0    0
                C   1992    2    0   0    0 
                C   1993    3    0   0    0 
                C   1994    3    0   0    0
                D   1991    1    1   0    1
                D   1992    2    1   0    1
                D   1993    3    1   0    1
                D   1994    4    1   0    1 
                D   1995    5    1   0    1 
                D   1996    5    0   1    0
                D   1997    6    1   0    0
不带变量A1和A2的Rawdata:

> dput(data)
structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), Year = c(1990L, 1991L, 1992L, 
1993L, 1994L, 1995L, 1990L, 1991L, 1992L, 1993L, 1991L, 1992L, 
1993L, 1994L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L
), X = c(1L, 1L, 2L, 3L, 4L, 4L, 0L, 1L, 1L, 2L, 1L, 2L, 3L, 
3L, 1L, 2L, 3L, 4L, 5L, 5L, 6L), Y = c(0L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L)), .Names = c("Subject", 
"Year", "X", "Y"), class = "data.frame", row.names = c(NA, -21L
))

这样行吗?你需要结构作为因素吗?下面的代码尚未实现结构上的更改,例如从C到D

mydata <- structure("Your code here")
mydata$max <- rep(F, nrow(mydata))
mydata$A1 <- rep(0, nrow(mydata))
mydata$A2 <- rep(0, nrow(mydata))

for (i in unique(mydata$Subject)) {
  max <- max(mydata$X[mydata$Subject == i])
  if (max >=3) {
    mydata$max[mydata$Subject == i] <- T
  }
}
mydata$A1 <- ifelse(mydata$max & c(F,diff(mydata$X) > 0), 1, 0)

mydata这样行吗?你需要结构作为因素吗?下面的代码尚未实现结构上的更改,例如从C到D

mydata <- structure("Your code here")
mydata$max <- rep(F, nrow(mydata))
mydata$A1 <- rep(0, nrow(mydata))
mydata$A2 <- rep(0, nrow(mydata))

for (i in unique(mydata$Subject)) {
  max <- max(mydata$X[mydata$Subject == i])
  if (max >=3) {
    mydata$max[mydata$Subject == i] <- T
  }
}
mydata$A1 <- ifelse(mydata$max & c(F,diff(mydata$X) > 0), 1, 0)

mydata我们可以用
data.table

library(data.table)
setDT(data)[, A1 := if(any(X >=4)) c(1, diff(X)) else 0, by = Subject]
data[,  A2 := if(any(X >=3))  inverse.rle(within.list(rle(Y==0), 
              values[values][lengths[values] < 5] <- 0)) else 0, by = Subject]

data[, c("Subject", "Year", "X", "A1", "Y", "A2"), with = FALSE]
#    Subject Year X A1 Y A2
# 1:       A 1990 1  1 0  0
# 2:       A 1991 1  0 0  0
# 3:       A 1992 2  1 0  0
# 4:       A 1993 3  1 1  0
# 5:       A 1994 4  1 0  0
# 6:       A 1995 4  0 0  0
# 7:       B 1990 0  0 0  0
# 8:       B 1991 1  0 0  0
# 9:       B 1992 1  0 0  0
#10:       B 1993 2  0 1  0
#11:       C 1991 1  0 0  0
#12:       C 1992 2  0 0  0
#13:       C 1993 3  0 0  0
#14:       C 1994 3  0 0  0
#15:       D 1991 1  1 0  1
#16:       D 1992 2  1 0  1
#17:       D 1993 3  1 0  1
#18:       D 1994 4  1 0  1
#19:       D 1995 5  1 0  1
#20:       D 1996 5  0 1  0
#21:       D 1997 6  1 0  0
库(data.table)
setDT(data)[,A1:=if(any(X>=4))c(1,diff(X))else 0,by=Subject]
数据[,A2:=if(any(X>=3))inverse.rle(在.list(rle(Y==0)内),

值[values][length[values]<5]我们可以使用
数据来实现这一点

library(data.table)
setDT(data)[, A1 := if(any(X >=4)) c(1, diff(X)) else 0, by = Subject]
data[,  A2 := if(any(X >=3))  inverse.rle(within.list(rle(Y==0), 
              values[values][lengths[values] < 5] <- 0)) else 0, by = Subject]

data[, c("Subject", "Year", "X", "A1", "Y", "A2"), with = FALSE]
#    Subject Year X A1 Y A2
# 1:       A 1990 1  1 0  0
# 2:       A 1991 1  0 0  0
# 3:       A 1992 2  1 0  0
# 4:       A 1993 3  1 1  0
# 5:       A 1994 4  1 0  0
# 6:       A 1995 4  0 0  0
# 7:       B 1990 0  0 0  0
# 8:       B 1991 1  0 0  0
# 9:       B 1992 1  0 0  0
#10:       B 1993 2  0 1  0
#11:       C 1991 1  0 0  0
#12:       C 1992 2  0 0  0
#13:       C 1993 3  0 0  0
#14:       C 1994 3  0 0  0
#15:       D 1991 1  1 0  1
#16:       D 1992 2  1 0  1
#17:       D 1993 3  1 0  1
#18:       D 1994 4  1 0  1
#19:       D 1995 5  1 0  1
#20:       D 1996 5  0 1  0
#21:       D 1997 6  1 0  0
库(data.table)
setDT(data)[,A1:=if(any(X>=4))c(1,diff(X))else 0,by=Subject]
数据[,A2:=if(any(X>=3))inverse.rle(在.list(rle(Y==0)内),


值[值][长度[值]<5]当您试图自己解决这些问题时,您忘记了包含您编写的不起作用的代码。请阅读我如何提出一个好问题,如何创建MCVE,以及如何在R中提供一个最小的可复制示例。然后相应地编辑和改进您的问题。即,从您的实际问题中提取……然后我们可以帮助您;-)目前还不清楚,你有什么以及缺少的部分。好的。让我知道。如果你愿意,我可以在周五看一看……你的重新发布的一些素材:你试图创建的变量基本上都是伪变量。对于检查一行中3个0等的变量,使用t生成新向量,它只是原始列的滞后然后你可以创建一个新的列来检查这些向量的值来创建你的新变量——你可以使用基R函数ifelse()对于这一点,我们认为有更漂亮的解决方案。对于您尝试进行的分组,请参阅以下堆栈溢出答案:
A1
这一行为什么为零:
B,1991,1,0
?您忘了包含您编写的代码,当您尝试自己解决这些问题时,这些代码不起作用。请阅读我如何提出一个好问题,如何创建MCV以及如何在R中提供一个最小的可复制示例。然后相应地编辑和改进您的问题。即,从您的实际问题中提取……然后我们可以帮助您;-)目前还不清楚,你有什么以及缺少的部分。好的。让我知道。如果你愿意,我可以在周五看一看……你的重新发布的一些素材:你试图创建的变量基本上都是伪变量。对于检查一行中3个0等的变量,使用t生成新向量,它只是原始列的滞后然后你可以创建一个新的列来检查这些向量的值来创建你的新变量——你可以使用基R函数ifelse()对于这一点,我认为有更漂亮的解决方案。对于您尝试进行的分组,请参见以下堆栈溢出答案:
A1
0在这一行中的原因:
B,1991,1,0
?非常感谢,Christoph!我正在考虑它对我的数据的作用。在最好的情况下,它应该能够认识到主题之间的差异(或结构)。@FKG:如果有效,将问题标记为已回答就太好了;-)非常感谢,克里斯托夫!我正在考虑它对我的数据有什么影响。在最好的情况下,它应该意识到主题(或结构)之间的差异。@FKG:如果有效,将问题标记为已回答就太好了;-)我在更大的样本上尝试了它,它似乎很有效-非常感谢!!!尽管由于某种原因,当X=0时会生成很多负值。我只是删除了它们,否则看起来都很好。@FKG感谢您的反馈。可能没有考虑X=0的条件。您好。我正在使用这一行:
setDT(data)[,A1:=if(any(X>=4))c(1,diff(X))else 0,by=Subject]
。是否可以将此部分—“if(any(X>=4))”调整为在X达到3(不超过3。如果超过3,则=0)时进行A1捕获。我尝试了
“if(any(X=3))”
但是它只捕获了X中的3个。我需要它来捕获1和2个。只是要明确一点:例如,如果某个主题的X大于3,那么A1就不应该捕获它。请告诉我创建一个新问题是否是更好的解决方法this@FKG你能不能把它作为一个新问题贴出来?我在网上试过了e更大的样本,而且似乎有效-非常感谢!!!尽管由于某种原因,X=0时生成了很多负值。我刚刚删除了它们,否则看起来都很好。@FKG感谢您的反馈。可能X=0的条件没有考虑在内。您好。我正在使用这一行:
setDT(data)[,A1:=if(any(X>=4)c(1,diff(X))else 0,by=Subject]
。是否可以将此部分—“if(any(X>=4))”调整为当X达到3(不超过3。如果超过3,则=0)时进行A1捕获。我尝试了
“if(any(X=3))”
但是它只捕获了X中的3个。我需要它同时捕获1和2个。只是要明确一点:例如,如果某个主题的X大于3,那么A1不应该