【发布时间】:2015-03-06 04:52:25
【问题描述】:
在 R 中,我想沿因子变量拆分数据框,然后将函数应用于与该变量的每个级别相关的数据。我想在我的函数中完成所有这些。不知何故,数据没有被拆分?
我不明白将参数传递给嵌套在其他函数中的函数的所有细微差别。我最初尝试使用 dplyr 执行此操作,但无法将参数传递给嵌套在我的函数中的 dplyr。
这是我的功能:
myFun <- function(dat, strat.var, PSU, var1){
strata <- as.character(unique(dat[, strat.var]))
N.h <- length(strata)
sdat <- with(dat, split(dat, strat.var))
fun1 <- function(x){ length(unique(x[, PSU])) }
fun2 <- function(x){ sum(tapply(x[, var1], x[, PSU], mean)) }
ns <- sapply(sdat, fun1)
mns <- sapply(sdat, fun2)
dfx <- data.frame(cbind(stratum=strata, ns=ns, mns=mns))
return(list(N.h = N.h, out=dfx))
}
为了证明我使用了 warpbreaks 数据,但我的实际数据集有 8 个级别的“strat.var”,并且嵌套在 2 到 10 个级别的“PSU”之间。
myFun(dat=warpbreaks, strat.var="wool", PSU="tension", var1="breaks")
# $N.h
# [1] 2
# $out
# stratum ns mns
# 1 A 3 84.4444444444444
# 2 B 3 84.4444444444444
但这是不正确的,因为我用手做:
sdat <- with(warpbreaks, split(warpbreaks, wool))
fun1 <- function(x, PSU){ length(unique(x[, PSU])) }
fun2 <- function(x, PSU, var1){ sum(tapply(x[, var1], x[, PSU], mean)) }
sapply(sdat, fun1, PSU="tension")
# A B
# 3 3
sapply(sdat, fun2, PSU="tension", var1="breaks")
# A B
# 93.11111 75.77778
我使用sapply() 是因为this one 和this one 之类的帖子。而且我没有使用subset(),因为我无法让它工作。我也愿意接受任何使用 dplyr() 的建议。
提前感谢您的任何帮助!
【问题讨论】:
-
您要计算的变量是(如warpbreaks$tension)因子的(数值)均值,还是数值?您可以计算一个因素水平的数值平均值,但这没有任何意义。
-
as.character(unique(dat[, strat.var]))只是您 group_by 变量上labels(dat[, strat.var])的混淆。其余的被混淆了group_by和summarize(newvar = mean(var)) -
@smci,当我使用
labels(dat[, strat.var])时,我得到一个1:54 的向量,即nrow(warpbreaks)。我错过了什么? -
噢!我的意思是
levels(dat[, strat.var])级别,而不是标签。 -
我开始在 dplyr 中实现这个,但希望你确认你在做什么,它似乎没有任何物理意义:首先你
group_by(strat.var),然后你分层做另一个group_by(PSU),和summarize(mns = mean(var1)),然后你取消组合(只是 PSU 上的拆分)并用这些个人手段的总和进行总结,然后你再次取消组合。对吗?