gpt4 book ai didi

r - 条件列创建(水平和垂直条件)

转载 作者:行者123 更新时间:2023-12-02 00:02:27 24 4
gpt4 key购买 nike

我的起始条件类似于 df 数据框

df<-data.frame(id=c(rep(2, 3), rep(4, 2)), year=c(2005:2007, 2005:2006), event=c(1,0,0,0,1))

id year event
1 2 2005 1
2 2 2006 0
3 2 2007 0
4 4 2005 0
5 4 2006 1

我有一系列 Actor (通过 id 标识)碰巧在某一年经历了一个事件。

我在这里尝试构建一系列额外的列,描述 a) 与事件的距离和 b) 这种距离是否可观察。

这就是我想要得到的。

   id year event evm2 evm1 evp1 evp2 ndm2 ndm1 ndp1 ndp2
1 2 2005 1 0 0 0 0 1 1 0 0
2 2 2006 0 0 1 0 0 1 0 0 1
3 2 2007 0 1 0 0 0 0 0 1 1
4 4 2005 0 0 0 1 0 1 1 0 1
5 4 2006 1 0 0 0 0 1 0 1 1

event 当某年有事件时等于 1。 evm1 当事件在前一年可观察到时等于 1。同样,当事件发生在下一年时,evp1 为 1 - 字母 pm 代表“加号”和“减号”,数字代表距离事件发生的年数。对于其中一些观测,距离是不可观测的,因为可用时间窗口太短。 df[1,] 就是这种情况,我们不知道在前几年是否发生过事件。在这种情况下,ndm1ndm2 编码为 1。如果我们考虑 df[5,] 的情况,它将是 ndp1(和 ndp2)被编码为 1。evnd 变量的工作方式完全相同。但前者告诉我们在某个距离是否有事件发生,而后者则告诉我们这个距离是否真的可以观察到。

我尝试使用以下嵌套 for 循环来完成此操作,但没有成功。

lag<-c(-2, -1, 1, 2)
df2<-df
df2[,4:11]<-0
colnames(df2)<-c("id", "year", "event", "evm2", "evm1", "evp1", "evp2", "ndm2", "ndm1", "ndp1", "ndp2")


for (i in length(df2$id)) {

id<-df2[i,1]
yr<-df2[i,2]
sta<-3
sta2<-7

for (j in lag){

sta<-sta+1
sta2<-sta2+1

if !is.null(df2[df2$id==id & df2$year==yr+j])==TRUE {

rw<-which(df2[df2$id==id & df2$year==yr+j])

if (df2[rw,3]==1) df2[i, sta]==1

} else {

df2[i, sta2]==1

}

}

}

您是否看到任何可能导致错误的原因?为了让它发挥作用,我已经发疯了两天,如果您能提供帮助,我将不胜感激。

最佳答案

根据我的评论,这是我想到的可能重写的内容:

lag.it <- function(x, n = 0L) {
l <- length(x)
neg.lag <- min(max(0L, -n), l)
pos.lag <- min(max(0L, +n), l)
c(rep(NA, +neg.lag),
head(x, -neg.lag),
tail(x, -pos.lag),
rep(NA, +pos.lag))
}

library(plyr)
ddply(df, "id", transform,
evm2 = lag.it(event, -2),
evm1 = lag.it(event, -1),
evp1 = lag.it(event, +1),
evp2 = lag.it(event, +2))

# id year event evm2 evm1 evp1 evp2
# 1 2 2005 1 NA NA 0 0
# 2 2 2006 0 NA 1 0 NA
# 3 2 2007 0 1 0 NA NA
# 4 4 2005 0 NA NA 1 NA
# 5 4 2006 1 NA 0 NA NA

请注意我是如何使用 NA 而不是使用两组变量的。虽然我建议您保持这种方式,但您可以通过定义例如轻松地获得您要求的内容ndm2is.na(evm2) 然后用零替换 NA

关于r - 条件列创建(水平和垂直条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com