R:应用函数来计算列表中单列数据帧的平均值

时间:2018-01-10 19:34:43

标签: r list apply lapply

一些示例数据

我有三个列表

    loc <- c("A","A","A","B","B","B")
    sub.loc <- c(1,2,3,1,2,3)

    set.seed(123)

    df1 <- as.data.frame(cbind(loc,sub.loc, round(rnorm(6),digits =2)))
    df2 <- as.data.frame(cbind(loc,sub.loc, round(rnorm(6),digits =2)))
    df3 <- as.data.frame(cbind(loc,sub.loc, round(rnorm(6),digits =2)))

    list.name <- list(df1,df2,df3)

我想生成一个包含第三列V3的均值和sd的文件。

Something like: 

    loc    sub.loc        V3                                      v4
    A        1        mean(c(-0.56,0.46,0.4))      sd(c(-0.56,0.46,0.4)) 
    A        2        mean(c(-0.23,-1.27,0.11))    sd(c(-0.23,-1.27,0.11))
    A        3        mean(c(-0.56,-0.69, 1.56))   sd(c(-0.56,-0.69, 1.56))
    B        1       mean(c(0.07,-0.45,1.79))      sd(c(0.07,-0.45,1.79))
    B        2        mean(c(0.13,1.22,0.5))       sd(c(0.13,1.22,0.5))
    B        3        mean(c(1.72,0.36,-1.97))     sd(c(1.72,0.36,-1.97))

我在'V3`列中的实际数据有NAs

我想过使用lapply

    lapply(list.name, function(x) mean(x, na.rm = T))

    lapply(list.name, function(x) sd(x, na.rm = T))

但是他们都给了我NAs

2 个答案:

答案 0 :(得分:1)

可以使用dplyr完成此操作。首先,我不确定您的上述样本数据与您的实际数据的匹配程度,但现在所有“数字”值都是因素。你真的不应该在cbind()内使用as.data.frame(),你可以将其排除在外。

但是根据上面的示例数据,我们可以将数据堆叠到一个更大的data.frame中,然后执行一个简单的group_by来获取所需的值

library(dplyr)
bind_rows(list.name, .id="from") %>% 
  mutate(V3=as.numeric(as.character(V3))) %>%  # fix the factors from the sample
  group_by(loc, sub.loc) %>% 
  summarize(mean=mean(V3, na.rm=T), sd=sd(V3, na.rm=T))

答案 1 :(得分:0)

目前,您在整个数据框架中运行aws emr create-cluster \ --applications Name=Spark Name=Ganglia \ --ec2-attributes "${EC2_PROPERTIES}" \ --service-role EMR_DefaultRole \ --release-label emr-5.8.0 \ --log-uri ${S3_LOGS} \ --enable-debugging \ --name ${CLUSTER_NAME} \ --region us-east-1 \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge InstanceGroupType=CORE,InstanceCount=4,InstanceType=m3.xlarge) mean(),其中包含非数字列,因此sd()

考虑基础R的NA(面向对象的by包装器),首先使用tapply堆叠数据框列表,然后在 loc 上运行聚合, sub.loc 分组:

rbind