【发布时间】:2020-10-09 03:49:34
【问题描述】:
感谢您查看我的问题
我正在尝试创建一个新变量,如果满足某些条件,它将从另一个变量中获取值;否则,取前一个观测值。
我可以通过运行这样的循环来做到这一点:
data <- mtcars
data$test <- NA
data$test <- as.numeric(data$test)
a0 <- Sys.time()
for (i in 2:nrow(data)) {
ifelse(data$carb[[i]] < 4,
data$test[[i]] <- data[[i-1,'test']],
data$test[[i]] <- data[[i,'mpg']]
)
a1 <- Sys.time()
per_left <- (i)/nrow(data)
print(paste("Time left is", round(as.numeric(as.difftime(a1-a0, units = "mins"))/per_left,2),"mins"))
}
但是,我的数据集超过 800 万个观测值。我觉得这不是节省时间的最佳方式。
***对于函数滞后: 不知何故,如果我使用滞后,滞后功能将使用以前记录的数据,而不是更新的数据。
例如。
df1 <- data.frame(ID = c(1, 1, 1, 1, 4, 5),
condition = c(FALSE,TRUE,TRUE,TRUE, TRUE, FALSE),
var1 = c('a', 'b', 'c', 'd', 'f', 'e'))
df2 <- df1 %>%
mutate(
new_2 = '0',
new_2 = case_when(
ID == lag(ID) & condition == TRUE ~ lag(new_2),
TRUE ~ var1
))
> df2
ID condition var1 new_2
1 1 FALSE a a
2 1 TRUE b 0
3 1 TRUE c 0
4 1 TRUE d 0
5 4 TRUE f f
6 5 FALSE e e
应该是
ID condition var1 new_2
1 1 FALSE a a
2 1 TRUE b a
3 1 TRUE c a
4 1 TRUE d a
5 4 TRUE f f
6 5 FALSE e e
我运行上面的函数,第 2 行应该采用之前的值 - a,而不是默认值 0。而如果我使用 for 循环,它将采用“a”。
有没有功能呢?或者我应该如何更新我的函数以使其更快?
请指教。 谢谢!
【问题讨论】:
-
尽管它们提供相同的输出,但您选择使用 [[ 而不仅仅是 [ 这里的任何理由:“[[i-1,'test']]”
-
你能显示预期的输出吗
-
你需要
df1 %>% mutate(new_2 = replace(var1, condition, lag(var1[condition]))) -
很难知道您的预期输出是什么。可能是
df1 %>% group_by(ID) %>% mutate(new_2 = case_when(condition ~ lag(var1), TRUE ~ '0')) -
很抱歉给您带来了困惑。让我试试你的建议。非常感谢你。我真的很感激。
标签: r