您好我正在尝试编写一个将接收数据框的函数,并在名称中有特殊字符或空格时修复其各自的列标题。该函数似乎有效,因为打印结果,但它似乎没有保存原始数据帧的相应更改。关于如何解决这个问题的想法?我用来测试它的数据是tbl_df,所以我不确定这是否与它未正确更新的原因有关。感谢。
nameChange <- function(df) {
for(i in 1:length(colnames(df)[i])) {
if(str_detect(colnames(df[i]),"[:punct:]|[:space:]") == TRUE) {
#Could use "\\s" to find space
names(df) <- str_replace_all(names(df)," *",'')
names(df) <- str_replace_all(names(df),"-",'')
#df <- df
assign('df',df, envir=.GlobalEnv)
#return(df)
print("Worked")
}
else{
print("Function did not replace anything")
}
}
}
这是我用来测试功能的数据:
#data from: http://www.tableau.com/learn/tutorials/on-demand/getting-started-data
orders_path <- file.path("/Users/petergensler/Desktop/Global Superstore.xls")
order_table <- read_excel(orders_path, sheet = "Orders")
nameChange(order_table)
一旦我在order_table上调用了colnames,您应该能够看到Product Sub-Category中的连字符被删除,并且每个列名称中的所有空格都不再存在。
答案 0 :(得分:4)
您的功能可以简化:
nameChange <- function(df) {
names(df) <- str_replace_all(names(df), "[:punct:]|[:space:]", "")
return(df)
}
示例:
library(dplyr)
library(stringr)
df <- tbl_df(mtcars)
names(df)[1] <- "m p g"
names(df)[2] <- "c-y-l"
names(df)
# [1] "m p g" "c-y-l" "disp" "hp" "drat" "wt" "qsec" "vs" "am"
# [10] "gear" "carb"
df <- nameChange(df)
names(df)
# [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
# [11] "carb"
答案 1 :(得分:0)
除了其他任何问题(在评论中提到; i
循环中的for
未定义),问题似乎是您没有分配回原始数据对象:
assign('df',df, envir=.GlobalEnv)
分配给对象df
,我猜测您在成功运行该功能后会在您的环境中找到该对象。
大概你想要
dfname <- deparse(substitute(df))
assign(dfname, df, envir=.GlobalEnv)
似乎可以用于测试。
答案 2 :(得分:-2)
以下是回答我问题的代码:
test1 <- function(df){
names(df) <- str_replace_all(names(df), "[:punct:]|[:space:]","")
df <<- df
return(df)
}
使用df作为参数没有任何问题,但你需要使用全局赋值&lt;&lt; - 运算符,以便几乎可以在任何数据帧上调用此函数,并且覆盖工作区中的现有df。谢谢大家的帮助。