【问题标题】:R: For calculating new variable R codeR:用于计算新变量 R 代码
【发布时间】:2013-01-26 07:40:19
【问题描述】:
               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=No。在此时间点之前的女性和nmale=否。在此时间点之前的女性

【问题讨论】:

  • 问题不清楚。改写正确。
  • 我建议使用NA 而不是0 来识别缺失值。
  • 我认为 OP 在 cumsum 之后表示个人性别/性别。
  • 但是为什么某处的女性人数中没有 3 个呢?跟身份证有关系吗?为什么 nfemale 列的两个之间有一个 0?

标签: r


【解决方案1】:

您可以使用 plyr 包中的函数 ddply。假设 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

【讨论】:

  • 我在 base +1 中使用了相同的基本方法
【解决方案2】:
 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)

【讨论】:

    【解决方案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
    }))
    

    【讨论】:

    • 好吧,你的按 'id' 分开,我的还没有。
    猜你喜欢
    • 2016-11-23
    • 2022-06-22
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多