在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个等级&#34; strat.var&#34;并嵌套在2到10级的&#34; PSU&#34;。
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
由于this one和this one这样的帖子,我使用sapply()
。而且我没有使用subset()
,因为我无法让它发挥作用。我也可以使用dplyr()
打开任何建议。
提前感谢您提供的任何帮助!
答案 0 :(得分:5)
您可以替换
sdat <- with(dat, split(dat, strat.var))
与
sdat <- split(dat, dat[strat.var])
<{1>}中的。
之前的代码并非myFun
,而是您获得了整个数据的splitting
,即
sum
使用更正的sum(with(warpbreaks, tapply(breaks, tension, FUN=mean)))
#[1] 84.44444
myFun
您还可以使用myFun(warpbreaks, strat.var='wool', PSU='tension', var1='breaks')
#$N.h
#[1] 2
#$out
# stratum ns mns
#A A 3 93.1111111111111
#B B 3 75.7777777777778
创建一个函数(您可以对下面的函数进行微调)
dplyr