我有一个数据集,其中有两个变量(var1和var2),代表两个时间的活着的个体。我需要用一个新的二进制变量创建一个表,其中的行数对应于var1的值,在这个变量中,我需要根据var2的值分配“1”(例如:如果var1中有10,var2中有3,那么我需要10行,其中3行为“1”,其余为“0”)。有什么功能可以帮助吗?谢谢
0md85ypi1#
一种与@Guillaume Mulier非常相似的方式,但矢量化;
x <- data.frame(id = 1:3, var1 = c(10, 5, 1), var2 = c(3, 3, 0)) with(x, data.frame(id=rep(id, var1), mort=rep(rep(1:0, nrow(x)), c(matrix(c(var2, var1 - var2), 2, byrow=TRUE))))) # id mort #1 1 1 #2 1 1 #3 1 1 #4 1 0 #5 1 0 #6 1 0 #7 1 0 #8 1 0 #9 1 0 #10 1 0 #11 2 1 #12 2 1 #13 2 1 #14 2 0 #15 2 0 #16 3 0
hjzp0vay2#
我可能误解了你的意思,但这是我所做的:
exemple <- data.frame(id = 1:3, var1 = c(10, 5, 1), var2 = c(3, 3, 0)) apply(exemple, 1, \(x) data.frame(id = rep(x[["id"]], times = x[["var1"]]), var_binaire = rep(c(1, 0), times = c(x[["var2"]], x[["var1"]] - x[["var2"]])))) |> do.call(what = "rbind")
它似乎做到了这一点,它通过使用函数rep重复1和0来创建一个data.frame。Apply与margin = 1一起用于执行行操作。因此,apply在这里创建一个列表,每个元素都是一个带有var1行和var_binaire = 1 var2次的data.frame。然后,do.call("rbind")将所有内容组合在一个data.frame中。结果如下:
rep
Apply
apply
do.call("rbind")
exemple id var1 var2 1 1 10 3 2 2 5 3 3 3 1 0 output id var_binaire 1 1 1 2 1 1 3 1 1 4 1 0 5 1 0 6 1 0 7 1 0 8 1 0 9 1 0 10 1 0 11 2 1 12 2 1 13 2 1 14 2 0 15 2 0 16 3 0
我以为没有apply也可以,但我不知道怎么做。也许会有更好的解决方案。希望这能帮上忙。
2条答案
按热度按时间0md85ypi1#
一种与@Guillaume Mulier非常相似的方式,但矢量化;
hjzp0vay2#
我可能误解了你的意思,但这是我所做的:
它似乎做到了这一点,它通过使用函数
rep
重复1和0来创建一个data.frame。Apply
与margin = 1一起用于执行行操作。因此,apply
在这里创建一个列表,每个元素都是一个带有var1行和var_binaire = 1 var2次的data.frame。然后,do.call("rbind")
将所有内容组合在一个data.frame中。结果如下:我以为没有apply也可以,但我不知道怎么做。也许会有更好的解决方案。希望这能帮上忙。