在因子上分割数据帧并应用函数

时间:2015-03-06 04:52:25

标签: r dplyr sapply

在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 onethis one这样的帖子,我使用sapply()。而且我没有使用subset(),因为我无法让它发挥作用。我也可以使用dplyr()打开任何建议。

提前感谢您提供的任何帮助!

1 个答案:

答案 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