[英]R: For calculating new variable R code
id time bord sex pbirth
132 1255 1 Female 17
132 1288 0 0 33
172 985 1 Female 24
172 1016 2 Female 31
172 1054 3 Male 38
172 1288 0 0 234
但是,要查找此数据。 我想通过性别来添加两个新变量。 如果性别连续等于女性,则下一行nfemale=1
;如果性别连续等于Male,则下一行nmale=1
。 它将按ID分割数据。
id time bord sex pbirth nfemale nmale
132 1255 1 Female 17 0 0
132 1288 0 0 33 1 0
172 985 1 Female 24 0 0
172 1016 2 Female 31 1 0
172 1054 3 Male 38 2 0
172 1288 0 0 234 2 1
通过R代码。 其中, sex=0
表示缺失值/无观察值, nfemale
=否。 该时间点之前女性的nmale
而nmale
=否。 此时间点之前的女性
您可以使用函数ddply
从plyr
包。 假设dat
是数据框的名称:
library(plyr)
ddply(dat, .(id), transform,
nFemale = c(0, head(cumsum(sex == "Female"), -1)),
nMale = c(0, head(cumsum(sex == "Male"), -1)))
id time bord sex pbirth nFemale nMale
1 132 1255 1 Female 17 0 0
2 132 1288 0 0 33 1 0
3 172 985 1 Female 24 0 0
4 172 1016 2 Female 31 1 0
5 172 1054 3 Male 38 2 0
6 172 1288 0 0 234 2 1
dat$nfemale <- cumsum( c(0, dat$sex[1:(nrow(dat)-1)] =="Female"))
dat$nmale <- cumsum( c(0, dat$sex[1:(nrow(dat)-1)] =="Male"))
dat
#-----
id time bord sex pbirth nfemale nmale
1 132 1255 1 Female 17 0 0
2 132 1288 0 0 33 1 0
3 172 985 1 Female 24 1 0
4 172 1016 2 Female 31 2 0
5 172 1054 3 Male 38 3 0
6 172 1288 0 0 234 3 1
在类别中执行此操作,这仅在示例而非说明中显而易见:
temp <- do.call(rbind, by(dat, dat$id,
function(d) data.frame(nfemale=cumsum( c(0, d$sex[1:(nrow(d)-1)] =="Female")),
nmale=cumsum( c(0, d$sex[1:(nrow(d)-1)] =="Male")) ) ) )
nfemale nmale
132.1 0 0
132.2 1 0
172.1 0 0
172.2 1 0
172.3 2 0
172.4 2 1
cbind(dat, temp)
回到这里,我的解决方案很臭,但无论如何我都会扔掉它(很好的DWin工作):
L1 <- split(dat, dat$id)
do.call(rbind.data.frame, lapply(L1, function(x){
x[, "nfemale"] <- c(0, head(cumsum(x[, "sex"] == "Female"), -1))
x[, "nmale"] <- c(0, head(cumsum(x[, "sex"] == "Male"), -1))
x
}))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.