[英]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
有沒有辦法讓它工作?
有幾件事正在發生。 首先,您需要確保df
是data.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.