gpt4 book ai didi

r - 带有 if/else 函数的 mutate()

转载 作者:行者123 更新时间:2023-12-01 08:23:45 29 4
gpt4 key购买 nike

我有一个示例数据框

df <- data.frame(cust = sample(1:100, 1000, TRUE),
channel = sample(c("WEB", "POS"), 1000, TRUE))

我正在尝试变异

get_channels <- function(data) {
d <- data
if(unique(d) %>% length() == 2){
d <- "Both"
} else {
if(unique(d) %>% length() < 2 && unique(d) == "WEB") {
d <- "Web"
} else {
d <- "POS"
}
}
return(d)
}

这可以毫无问题地工作,并且在小型数据帧上完全不需要时间。

start.time <- Sys.time()

df %>%
group_by(cust) %>%
mutate(chan = get_channels(channel)) %>%
group_by(cust) %>%
slice(1) %>%
group_by(chan) %>%
summarize(count = n()) %>%
mutate(perc = count/sum(count))

end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

Time difference of 0.34602 secs

但是,当数据框变得相当大时,比如说,大约 >1000000 或更多cust,我的基本 if/else fx 需要很多,更多更长。

如何简化此功能以使其运行更快?

最佳答案

您应该为此使用 data.table。

setDT(df)
t1 = Sys.time()
df = df[ , .(channels = ifelse(uniqueN(channel) == 2, "both", as.character(channel[1]))), by = .(cust)]

> Sys.time() - t1
Time difference of 0.00500083 secs

> head(df)
cust channels
1: 37 both
2: 45 both
3: 74 both
4: 20 both
5: 1 both
6: 68 both

关于r - 带有 if/else 函数的 mutate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43988790/

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