【发布时间】:2015-06-30 08:40:37
【问题描述】:
我有一个数据框df,其中包含三个分类变量cat1、cat2、cat3 和两个连续变量con1、con2。我想根据列列表cat1,cat2,cat3 的不同组合计算列con1,con2 上的函数列表sd,mean。我已经明确地对所有不同的组合进行了子集化。
# Random generation of values for categorical data
set.seed(33)
df <- data.frame(cat1 = sample( LETTERS[1:2], 100, replace=TRUE ),
cat2 = sample( LETTERS[3:5], 100, replace=TRUE ),
cat3 = sample( LETTERS[2:4], 100, replace=TRUE ),
con1 = runif(100,0,100),
con2 = runif(100,23,45))
# Introducing null values
df$con1[c(23,53,92)] <- NA
df$con2[c(33,46)] <- NA
results <- data.frame()
funs <- list(sd=sd, mean=mean)
# calculation of mean and sd on total observations
sapply(funs, function(x) sapply(df[,c(4,5)], x, na.rm=T))
# calculation of mean and sd on different levels of cat1
sapply(funs, function(x) sapply(df[df$cat1=='A',c(4,5)], x, na.rm=T))
sapply(funs, function(x) sapply(df[df$cat1=='B',c(4,5)], x, na.rm=T))
# calculation of mean and sd on different levels of cat1 and cat2
sapply(funs, function(x) sapply(df[df$cat1=='A' & df$cat2=='C' ,c(4,5)], x, na.rm=T))
.
.
.
sapply(funs, function(x) sapply(df[df$cat1=='B' & df$cat2=='E' ,c(4,5)], x, na.rm=T))
# Similarly for the combinations of three cat variables cat1, cat2, cat3
我想写一个函数来动态计算基于不同组合的列列表的函数列表。你能不能给一些建议。谢谢!
编辑:
我已经使用dplyr 得到了一些明智的建议。如果有人使用apply 系列函数提供建议,那就太好了,因为这将有助于在进一步的要求中使用它们(数据框)。
【问题讨论】:
-
你可以试试
library(dplyr); df %>% group_by(cat1, cat2, cat3) %>% summarise_each(c("sd", "mean"))并阅读更多关于?summarise_each的信息 -
@docendodiscimus 智能解决方案。我有一个小问题。当我只需要基于
cat1,cat2在con1,con2上应用函数时,它也在计算cat3 的平均值和标准差。如何避免这种情况?我用过df %>% group_by(cat1, cat2) %>% summarise_each(funs(mean(., na.rm = TRUE),sd(., na.rm = TRUE))) -
选择/取消选择特定列有不同的选项,例如您可以使用
df %>% group_by(cat1, cat2) %>% summarise_each(funs(mean(., na.rm = TRUE),sd(., na.rm = TRUE)), -cat3)或df %>% group_by(cat1, cat2) %>% summarise_each(funs(mean(., na.rm = TRUE),sd(., na.rm = TRUE)), starts_with("con"))。有关更多信息,请查看来自 dplyr 的?select中提到的特殊功能。