[英]r - How to expand data.frame over unused factor levels?
我需要為所有具有公共變量的數據框列表執行此操作。 我想擴展每個數據幀,以便它們將公共變量擴展到所有數據幀中存在的所有級別。
myList <- list(A = data.frame(A1 = rnorm(10), A2 = rnorm(10), A3 = rnorm(10),
year = factor(c(2000:2009))),
B = data.frame(B1 = rnorm(10), B2 = rnorm(10), B3 = rnorm(10),
year = factor(c(2001:2010))))
masterYear <- unique(unlist(lapply(myList, function(x) levels(x$year)), use.names = F))
到目前為止,我已經嘗試在函數中使用 dplyr 和 tidyr 包
funExpand <- function(x){
levels(x$year) <- c(levels(x$year), setdiff(masterYear, levels(x$year)))
vars <- names(x)[-length(names(x))]
x %>%
tidyr::complete_(x, c(vars), fill = list(0))
x
}
myList2 <- lapply(myList, funExpand)
但這會產生錯誤。 我嘗試了 tidyr::complete 和 tidyr::complete_ 函數的各種組合(第一個參數是 x 還是年份?),都產生了一些錯誤。 這告訴我我沒有正確解釋完整的功能。
除了修復此錯誤之外,我還歡迎所有改進流程的建議。
我猜你不需要x %>%
funExpand <- function(x) {levels(x$year) <- c(levels(x$year),
setdiff(masterYear, levels(x$year)))
vars <- names(x)[-length(names(x))]
complete_(x, vars, fill=list(0))}
lapply(myList, funExpand)
更新以反映 OP 的評論
嘗試這個,
myList2 <- lapply(myList,
function(db) {
db$year <- factor(as.character(db$year), levels=masterYear)
merge(db, data.frame(year=setdiff(masterYear, db$year)), all=T)
})
新行將具有NA
,如果你真的需要他們0
添加另一條線db[is.na(db)] <- 0
的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.