[英]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.