全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
1299 2
2017-09-15
悬赏 50 个论坛币 已解决
事情起因是我希望写一个Summary函数,用来统计一个dataframe里每列数的均值、标准差、2分位数、4分位数等,再统一输出到df表里,代码如下:
getSummary<-function(dataframe,scope){
   dataframe<-as.data.frame(dataframe)
   df<-data.frame(matrix(numeric(),ncol(dataframe),length(scope)+1,dimnames=list(c(),c("Indexname",scope))))
   df$Indexname<-names(dataframe)
   for(i in 1:length(scope)){
     df[,i+1]<-switch(scope,
                      Mean=apply(dataframe,2,function(x){mean(x,na.rm=TRUE)}),
                      SD=apply(dataframe,2,function(x){sd(x,na.rm=TRUE)}),
                      ifelse(grep("Quantile",scope)==1,
                      apply(dataframe,2,function(x){quantile(x,as.numeric(gsub("[^0-9]","",scope))/100,na.rm=TRUE)})
                      ,NA)                    
     )
   }
   return(df)
}

scope <- c("Mean", "SD", "X20Quantile","X40Quantile","X60Quantile","X80Quantile")
dSFA<-getSummary(dataframe,scope)

然而,最后的结果却出现,dataframe每列数的2、4、6、8分位数都是一样的,即都等于dataframe第一列的2、4、6、8分位数如截图

27 分钟前 上传
下载附件 (22.63 KB)


。而如果我把代码简单化,改成X20Quantile= apply(dataframe,2,function(x){quantile(x,as.numeric(gsub("[^0-9]","",scope))/100,na.rm=TRUE)}),结果是对的如截图

18 分钟前 上传
下载附件 (8.62 KB)


。有些怀疑人生,万能的贴吧大神,请问问题出在哪里???

最佳答案

jiangbeilu 查看完整内容

这个问题不在于apply,而是你用了ifelse 抽象出来,就是这个样子: grepl是正确的,但是因为只有一次判定,所以你希望它返回1:2这一个向量,然而实际上,只给你一个1。 这种方式,你可以if做一次判定,而不是用ifelse。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-9-15 00:54:14
这个问题不在于apply,而是你用了ifelse
抽象出来,就是这个样子:
复制代码

grepl是正确的,但是因为只有一次判定,所以你希望它返回1:2这一个向量,然而实际上,只给你一个1。
这种方式,你可以if做一次判定,而不是用ifelse。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-9-26 12:24:27
jiangbeilu 发表于 2017-9-15 00:54
这个问题不在于apply,而是你用了ifelse
抽象出来,就是这个样子:
最近比较忙没及时回复,真诚感谢你的回答。原来是版主亲自回帖呀,能耐心把问题看完,荣幸之至。我之前把ifelse和if混为一谈了,还好及时发现,要不不知道会在工作中发生多少错误。版主辛苦,祝工作顺利
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

分享

扫码加好友,拉您进群