【问题标题】:Create array based on column relationships根据列关系创建数组
【发布时间】:2015-05-02 15:55:52
【问题描述】:

我正在尝试在 R 中创建一个生存数组。这是我当前的数据框(注意:真实数据集有超过 500 个唯一 ID):

Hyena DOB  Death
A     1989 1990 
B     1989 1991  
C     1990 1990 

我想创建 1989 年到 1991 年(研究范围)之间的新年份列。然后,对于每只鬣狗,我想为每个相应的列年份(例如 1989、1990、1991)编码它是活的(“1”)还是死/未出生的(“0”)。

例如:对于鬣狗 A,DOB = 或 1989,因此 1989 列为“1”。此外,DOB = 或 1990,因此 1990 列为“1”。虽然, DOB = 或

最后,我希望我的数据框看起来像这样:

Hyena DOB  Death 1989 1990 1991
A     1989 1990   1    1    0
B     1989 1991   1    1    1
C     1990 1990   0    1    0

我一直在尝试 for 循环,但我只是不够精明,不知道自己在做什么。非常感激任何的帮助!!希望这不会太混乱

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以试试

    library(qdapTools)
    cbind(df1,  mtabulate(Map(seq, df1$DOB, df1$Death)))
    #    Hyena  DOB Death 1989 1990 1991
    #1     A 1989  1990    1    1    0
    #2     B 1989  1991    1    1    1
    #3     C 1990  1990    0    1    0
    

    或者data.table的选项

    library(data.table)#v1.9.5+
    setkey(setDT(df1),Hyena)[dcast(df1[, seq(DOB, Death), by=Hyena][,
               .N,list(V1, Hyena)], Hyena~V1, value.var='N', fill=0)]
    #  Hyena  DOB Death 1989 1990 1991
    #1:     A 1989  1990    1    1    0
    #2:     B 1989  1991    1    1    1
    #3:     C 1990  1990    0    1    0
    

    或者使用base R

    lst <- Map(seq, df1$DOB, df1$Death)
    Un1 <- sort(unique(unlist(lst)))
    cbind(df1, t(sapply(lst, function(x) table(factor(x, levels=Un1)))))
    

    数据

    df1 <- structure(list(Hyena = c("A", "B", "C"), DOB = c(1989L, 1989L, 
    1990L), Death = c(1990L, 1991L, 1990L)), .Names = c("Hyena", 
    "DOB", "Death"), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2022-12-03
      • 2022-01-02
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多