功能不保存对DataFrame的更改

时间:2016-08-10 23:11:20

标签: r dataframe

您好我正在尝试编写一个将接收数据框的函数,并在名称中有特殊字符或空格时修复其各自的列标题。该函数似乎有效,因为打印结果,但它似乎没有保存原始数据帧的相应更改。关于如何解决这个问题的想法?我用来测试它的数据是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中的连字符被删除,并且每个列名称中的所有空格都不再存在。

3 个答案:

答案 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。谢谢大家的帮助。