簡體   English   中英

在分組的df中的組之間復制數據

[英]Copying data between groups in a grouped df

我對具有缺失值塊的數據進行了分組。 我使用dplyr來計算每個組中目標變量的總和。 對於總和為零的組,我想用上一組的值替換該組的值。 我可以循環執行此操作,但是由於我的數據位於大數據幀中,因此效率極低。

這是一個綜合示例:

df <- tbl_df(as.data.frame(cbind(c(rep(1, 4), rep(2, 4)), 
                           c(abs(rnorm(4)), rep(NA, 4)))))

names(df) <- c("group", "var")

df <- df %>%
        group_by(group) %>%
        mutate(total = sum(var, na.rm = TRUE)) 

輸出:

Source: local data frame [8 x 3]
Groups: group

  group       var   total
1     1 1.3697267 4.74936
2     1 1.5263502 4.74936
3     1 0.4065596 4.74936
4     1 1.4467237 4.74936
5     2        NA 0.00000
6     2        NA 0.00000
7     2        NA 0.00000
8     2        NA 0.00000

在這種情況下,我想將組2中的var值替換為組1中的var值,並通過檢測組2中的total = 0來做到這一點。

我試圖提出一個自定義函數以饋入do()來執行此操作,但是無法弄清楚如何告訴它用另一個組中的值替換當前組中的值。 在上面的示例中,我嘗試了以下操作,這些操作將始終使用組1中的值進行替換:

CheckDay <- function(x) { 
  if( all(x$total == 0) ) { x$var <- df[df$group==1, 2] } ; x 
}

do(df, CheckDay)

CheckDay確實返回df,但是do()引發錯誤:

Error: Results are not data frames at positions: 1, 2

有沒有辦法讓它工作?

有幾件事正在發生。 首先,您需要確保dfdata.frame ,您的CheckDay(x)函數同時具有局部變量x和局部變量x ,而局部變量x您賦予值df作為全局變量df本身,最好將函數內部的所有內容都保持局部。 最后,您對do(df, CheckDay(.))的調用缺少(.)部分。 試試這個,這應該工作:

library("dplyr")

df <- tbl_df(as.data.frame(cbind(c(rep(1, 4), rep(2, 4)), 
                                 c(abs(rnorm(4)), rep(NA, 4)))))

names(df) <- c("group", "var")

df <- df %>%
  group_by(group) %>%
  mutate(total = sum(var, na.rm = TRUE))
df <- as.data.frame(df)


CheckDay <- function(x) {
  if( all( (x[x$group == 2, ])$total == 0) ) { 
    x$var <- x[x$group == 1, 2] 
  }  
  x 
}

result <- do(df, CheckDay(.))
print(result)

為了擴展Brouwer的答案,以下是我為實現目標而實現的目標:

  • 像以前一樣生成df
  • 創建df.shift ,具有組df.shift ...等的df的副本-即具有向下移動一組變量的df。 df.shift組1中的df.shift也可以簡單地為空白。)
  • 獲取total = 0的索引,然后將df.shift的值復制到這些索引處的df中。

所有這些都可以在基數R中完成。它創建一個副本,但是比循環遍歷這些組便宜得多且更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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