r - 代码在函数之外工作,但不在函数内部
问题描述
很抱歉让这个不可重现。该代码基本上将根据四分位数的各个列重新编码为新变量_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)
解决方案
我无法真正找出您的代码中的问题,因为您没有说明该函数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超出舍入分位数定义的范围。
推荐阅读
- mongodb - 如何整合 Jmeter + graylog + mongodb ?
- typo3 - 当所有语言都配置为语言 slug 作为基础时,TYPO3 重定向关于基础 / 导致 404
- python - 将 na 值分配给 Pandas 数据框不起作用
- javascript - .替换功能不起作用 - 使用谷歌表格脚本编辑器的自动邮件模板
- r - 为什么是NA | 错误 = 不适用?
- react-native - 带有 React Native 视频的自定义播放/暂停按钮 - 获取 JSON 值错误消息
- python - 在 python 图中将 2^n 转换为数值
- tensorflow - 计算 YAMNET 中某一层的梯度
- c# - Razor 页面中的相同 URL 端点
- html - 输入元素(由 vuetify 生成)不会为长文本换行