簡體   English   中英

在 lapply/apply function 中使用 ifelse function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM