[英]Using an ifelse function in a lapply/apply function
嘗試將 function 應用於大型數據集。 具體來說,嘗試應用在該行中找到的日期 (df$date) 之前設置的最低 1000 次 (df$time) 的平均值。 將此 function 應用於一小部分工作
但是,由於數據集太大,我想將應用限制在 df$wr 為 true 的 1% 的行中。
這是我到目前為止編寫的代碼,將 mean1000 作為新變量的預期名稱,並根據名稱拆分數據集(25 個類別):
df1 <- data.frame(
mean1000 = lapply(
split(df, df$name), function(y)
df$y$mean1000 = apply(y, 1, function(x) {ifelse(x["wr" == TRUE],
mean(sort(df$time[df$date < x["date"]])[2:1000]), NA)})) %>%
unlist()
)
結果:
df1 已創建,但它只是一個表,其中包含 1 個變量 (mean1000) 的 0 個觀察值
錯誤消息是以下的 25 次:
1. Unknown or uninitialised column `y`.
我主要遵循此處概述的指南,但這些解決方案沒有我想要做的復雜/分層。 如何調整代碼?
數據:
| # | time | date | id1 | id2 | rank | name | wr |
|---|------|-----------|-----|-----|------|-------|------|
| 1 | 2408 | 2022-06-04| a8m2| pr9w| 24 | City01| TRUE |
| 2 | 2503 | 2022-06-25| b6p5| ur1r| 226 | City01| FALSE|
| 3 | 2672 | 2022-05-07| c8k1| py5l| 371 | City01| FALSE|
期望的結果是添加一個額外的列,當wr值為真的。
考慮by
(object-oriented wrapper to tapply
),它與split
+ lapply
非常相似,但更精簡。 然后運行嵌入式sapply
進行逐行平均條件計算。
# SORT DATA BY NAME AND DATE
df1 <- with(df1, df1[order(name, date),]) |> `row.names<-`(NULL)
# CONDITIONALLY CALCULATE MEAN BY GROUP
df1$mean100 <- by(df1, df1$name, function(sub), {
# ITERATE THROUGH EVERY DATE ROW
mean1000 <- sapply(
sub$date,
# SUBSET AND CALCULATE MEAN
FUN=\(dt) mean(sub$time[sub$date < dt][2:1000], na.rm=TRUE)
)
# CONDITIONALLY ADJUST BY wr FLAG
mean1000 <- ifelse(sub$wr == TRUE, mean1000, NA_real_)
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.