r - 如何在未使用的因子水平上扩展 data.frame?
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 或 year?),所有这些都会产生一些错误。这告诉我我没有正确解释完整的功能。
除了修复此错误外,我还欢迎所有改进流程的建议。
我猜你不需要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
。
我需要对所有具有公共变量的数据帧列表执行此操作。我想扩展每个数据帧,以便它们将公共变量扩展到所有数据帧中存在的所有级别。
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 或 year?),所有这些都会产生一些错误。这告诉我我没有正确解释完整的功能。
除了修复此错误外,我还欢迎所有改进流程的建议。
我猜你不需要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
。