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
,如果性别等于男性,则排在下一行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
=否。在这个时间点之前的女性
答案 0 :(得分:4)
您可以使用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
答案 1 :(得分:3)
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
在类别中进行,只在示例中显而易见,而不是在sescription中:
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)
答案 2 :(得分:3)
回到这里,我的解决方案很糟糕,但无论如何我都会把它扔掉(很好的工作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
}))