gpt4 book ai didi

r - 使用 R 的方法比 'for' 循环更有效

转载 作者:行者123 更新时间:2023-12-04 10:36:30 25 4
gpt4 key购买 nike

我是 R 的相对新手,所以如果对此有明显的答案,我很抱歉。我查看了其他问题,我认为“应用”是答案,但我不知道在这种情况下如何使用它。

我有一个纵向调查,每年都会邀请参与者。有些年他们没有参加,有时他们会死。我需要确定哪些参与者从调查开始就参与了一致的“连续”(即如果他们停止,他们就永远停止)。

我已经使用“for”循环完成了此操作,它在下面的示例中工作正常。但是我有很多年和很多参与者,循环很慢。我可以使用更快的方法吗?

在示例中,TRUE 表示他们参加了那一年。该循环创建两个向量 - 'finalyear' 表示他们参加的最后一年,以及 'streak' 以显示他们是否在 finalyear 之前的所有年份完成(即案例 1、3 和 5)。

dat <- data.frame(ids = 1:5, "1999" = c(T, T, T, F, T), "2000" = c(T, F, T, F, T), "2001" = c(T, T, T, T, T), "2002" = c(F, T, T, T, T), "2003" = c(F, T, T, T, F))
finalyear <- NULL
streak <- NULL
for (i in 1:nrow(dat)) {
x <- as.numeric(dat[i,2:6])
y <- max(grep(1, x))
finalyear[i] <- y
streak[i] <- sum(x) == y
}
dat$finalyear <- finalyear
dat$streak <- streak

谢谢!

最佳答案

For 循环在 R 中本质上并不坏,但是如果您迭代地增长向量(就像您正在做的那样),它们会很慢。通常有更好的方法来做事。仅具有应用功能的解决方案示例:

dat$finalyear <- apply(dat[,2:6],MARGIN=1,function(x){max(which(x))})
dat$streak <- apply(dat[,2:7],MARGIN=1,function(x){sum(x[1:5])==x[6]})

或选项 2,基于@Spacedman 的评论:
dat$finalyear <- apply(dat[,2:6],MARGIN=1,function(x){max(which(x))})
dat$streak <- apply(dat[,2:6],MARGIN=1,function(x){max(which(x))==sum(x)})

> dat
ids X1999 X2000 X2001 X2002 X2003 finalyear streak
1 1 TRUE TRUE TRUE FALSE FALSE 3 TRUE
2 2 TRUE FALSE TRUE TRUE TRUE 5 FALSE
3 3 TRUE TRUE TRUE TRUE TRUE 5 TRUE
4 4 FALSE FALSE TRUE TRUE TRUE 5 FALSE
5 5 TRUE TRUE TRUE TRUE FALSE 4 TRUE

关于r - 使用 R 的方法比 'for' 循环更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32396681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com