r - 根据列关系创建数组

标签 r dataframe

我正在尝试在 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/

相关文章:

python - 将列表从一个数据框扩展到另一个数据框 pandas

r - 根据 data.frame r 中另一列的值从列中提取信息

r - 如何在 Linux 中升级 R?

r - 如何将循环合并到我的数据子集中

r - isSymmetric 为 R 3.2.2 中的对称矩阵返回 FALSE

r - 如何将数据从长格式 reshape 为宽格式以实现此输出?

r - magrittr 包中的管道不适用于函数 rm()

python - 设置 pandas Dataframe Boxplot() 的 y 轴刻度,3 个偏差?

将值替换为另一个数据帧的值

R Dataframe - 在时间序列中应用表达式,并将结果输出到新的数据帧中