我正在尝试在 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 AND Death = 或 >1989,因此第 1989 列为“1”。此外,DOB = 或 < 1990 AND Death = 或 >1990,因此第 1990 列为“1”。 ,DOB = 或 < 1991,死亡 < 1991,因此第 1991 列为“0”。
最后,我希望我的数据框看起来像这样:
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 循环,但我只是不够精明,不知道自己在做什么。非常感激任何的帮助!!希望这不会太令人困惑
最佳答案
你可以试试
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
或者使用基础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))
关于r - 根据列关系创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30004383/