如何解决代码在函数外部起作用,但在内部不起作用
抱歉,无法复制此内容。该代码基本上根据四分位数将各个列重新编码为新变量_REC
,并将它们添加到矩阵中。
这些是我需要的变量的名称。
admin<-c("D5_1_Num_contractes_Ajuntaments_abans_estat_alarma","D5_2_Num_contractes_Consells_Comarcals_abans_estat_alarma","D5_3_Num_contractes_Generalitat_abans_estat_alarma","D5_4_Num_contractes_Altres_AAPP_abans_estat_alarma")
这是有效的代码。
columnes<-admin
dades<-vector()
for(i in 1:length(columnes)){
dades<-c(dades,m[,colnames(m)==columnes[i]])
}
quartils<-signif(quantile(dades,c(0.25,0.5,0.75),na.rm=TRUE),1)
for(i in 1:length(columnes)){
m<-cbind(m,recod_quart(m[,colnames(m)==columnes[i]],quartils))
}
colnames(m)[(ncol(m)-length(columnes)+1):ncol(m)]<-paste0(columnes,"_REC")
这不是的那段代码。
recod_columnes<-function(columnes){
dades<-vector()
for(i in 1:length(columnes)){
dades<-c(dades,colnames(m)==columnes[i]])
}
quartils<-signif(quantile(dades,1)
for(i in 1:length(columnes)){
m<-cbind(m,quartils))
}
colnames(m)[(ncol(m)-length(columnes)+1):ncol(m)]<-paste0(columnes,"_REC")
}
recod_columnes(columnes=admin)
解决方法
我无法在您的代码中真正找到问题,因为您没有告诉函数recod_quart
的确切作用(我也没有在线上找到该名称的R函数)。如果您没有定义此功能,那似乎就是问题所在。
无论如何,我确实对您想要实现的目标有所了解,但是您必须告诉您这是否是您想要的目标:
get.qs <- function(x) {
qq <- quantile(x,c(0,0.25,0.5,0.75,1),na.rm=TRUE) #find the quartile "breaks" in x
cut(x,breaks=qq,labels=FALSE,include.lowest=TRUE) #return quartiles as numbers 1-4
}
col.quartiles <- function(dades,columnes) {
dades <- as.data.frame(dades) #data frames make indexing easyier
dd <- matrix(nrow=nrow(dades),ncol=length(columnes)) #preallocate result matrix
for( i in 1:length(columnes) ) dd[,i] <- get.qs(dades[,columnes[i]]) #use get.qs
colnames(dd) <- paste0(columnes,"_REC") #make the new column names
dd
}
我确信必须使用dplyr
软件包中的某些工具来提供第二种功能的更优雅的方法,但是此解决方案仅使用base R,我个人更喜欢将来可能重用的功能。
我用以下可重现的示例测试了该功能:
set.seed(101)
m <- cbind(A = runif(20,1,10),B = runif(20,C = runif(20,D = runif(20,E = runif(20,10)
)
cc <- c("A","D","E")
col.quartiles(dades=m,columnes=cc)
请注意,我省略了signif()
函数,因为四舍五入会四舍五入会导致列中最小值或最大值的错误。例如,如果最低值为0.99,则将0分位数四舍五入为1,而原始值0.99在四舍五入的分位数定义的范围内 outside 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。