【问题标题】:Code works outside of a function but not inside代码在函数之外工作,但不在函数内部
【发布时间】:2020-09-15 10:30:09
【问题描述】:

很抱歉让这个不可重现。这段代码基本上是将各个列按照四分位数重新编码成新的变量_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,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(columnes=admin)

【问题讨论】:

  • 当你说它不起作用时。究竟会发生什么?你得到一个错误(它说什么?)还是结果没有意义?

标签: r function


【解决方案1】:

我无法真正找出您的代码中的问题,因为您没有说出函数 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, 1, 10),
           C = runif(20, 1, 10),
           D = runif(20, 1, 10),
           E = runif(20, 1, 10)
           )

cc <- c("A", "D", "E")

col.quartiles(dades=m, columnes=cc)

请注意,我省略了signif() 函数,因为四舍五入会导致列中的最小值或最大值出现错误。例如,如果最小值为 0.99,则 0 分位数舍入为 1,原始值 0.99 超出舍入分位数定义的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多