繁体   English   中英

R:用于计算新变量R代码

[英]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 =否。 该时间点之前女性的nmalenmale =否。 此时间点之前的女性

您可以使用函数ddplyplyr包。 假设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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM