【发布时间】:2016-08-10 23:11:20
【问题描述】:
您好,我正在尝试编写一个接收数据框的函数,如果名称中有特殊字符或空格,则修复其各自的列标题。该功能似乎可以工作,因为打印了结果,但它似乎没有将相应的更改保存到原始数据帧。关于如何解决这个问题的想法?我用来测试它的数据是 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 中的连字符已被删除,并且每个列名称内的所有空格都不再存在。
【问题讨论】:
-
只是为了检查...
str_replace_all(names(df)," *",'')和str_replace_all(names(df),"-",'')给你想要的输出? -
是的,我知道部分功能可以正常工作。我可以使用 \\s 来查找字符串中的空格,或者使用 [:space:] 来检测它们。我真正的问题是,当我将它传递给 tbl_df 时,它会显示所做的更改,但是当我在 tbl_df 上调用 colnames 时,看起来并没有保存更改。
-
它说它有效,但它似乎仍然没有保存结果。
-
也许 MWE 会有所帮助。
-
@petergensler 您是否希望它修改输入数据框并将其保存为相同的名称,以便如果您调用
nameChange(hey)会修改“嘿”data.frame?如果是这样,那么您只是对事物的运作方式有误解。您将直接保存到“df”,因此如果您查看全局环境,您应该会看到保存为“df”的结果