【问题标题】:Creating new data frame in function in R在R中的函数中创建新数据框
【发布时间】:2017-12-12 13:13:20
【问题描述】:

我一直在尝试编写一个基于前一个对象创建新对象的函数(经过几次更改)。然而,我没能做到。 这是我的数据框:

 Names <- c("Tom", "Alex", "James", "John", "Wayne", "Harry") 
 a <- c(1,3,6,8, NA, 5) 
 b <- c(3,6,9,1, NA,1)  
 c <- c(7,3,1,6,NA,6) 
 d <- c(1,4,7,2,NA,8) 
 data <- data.frame(Names,a,b,c,d)

这是我的功能

NAvalues <- function(x,object, y){
    object[sample(seq_len(nrow(object)), x, replace = FALSE),-1] <- NA   
    summary(object)   
    y <- data.frame(object) 
} 

第一部分工作正常,但我正在努力创建一个新对象,它的名称将由 y 指定。

NAvalues(2, data, new)

当我使用它时,我收到一个错误,提示没有new 这样的对象。 谁能告诉我为什么会这样?

【问题讨论】:

  • 因为没有名为“新”的对象。您在函数内部创建了一个名为“y”的对象,但无论如何,“y”都会在函数结束时消失。为什么不只是去掉'y'参数,而是从函数内部返回创建的data.frame,然后将函数的输出分配给你想要它调用的东西?所以你会使用这样的功能...... new &lt;- NAvalues(2, data)
  • 这真的很有帮助。谢谢!
  • 只是为了扩展@Dason 的评论:也许您正在考虑通过“通过引用”传递new(就像您可以/将在例如 C++ 中做的那样)。这不是 R 的工作方式。您必须将 R 函数的输出(return 参数)分配给新变量。
  • @kubafrustrat 我用解决方案更新了我的答案

标签: r function dataframe


【解决方案1】:

据我了解,您的任务目标是通过执行函数 NAvalues() 创建一个由参数 y 定义的命名数据帧。

NAvalues <- function(x,object, y){
        object[sample(seq_len(nrow(object)), x, replace = FALSE),-1] <- NA   
        summary(object)
        assign(paste(y), data.frame(object), envir = .GlobalEnv)
} 

NAvalues(x = 2, object = data, y = "new")  #y must be a character because it is the name of the new data.frame

解决方案的关键是

assign(paste(y), data.frame(object), envir = .GlobalEnv)

允许创建一个名为stringparametery的变量并将该变量分配给global.environment

【讨论】:

  • y = new 仍然是多余的。只需从函数调用中删除y 变量,并将其与new &lt;- NAvalues(x = 2, object = data) 一起使用。
  • @LAP 你是对的,但是,我正在回答@kubafrustrat 的问题。此外,我的印象是他想使用函数NAvalues()global.environment中创建一个data.frame作为side-effect
  • 如果是这样,您需要指定y &lt;&lt;- data.frame(object),而return(y) 将是多余的。现在,.globalEnv 中没有创建任何数据框。不过,最好使用new &lt;- NAvalues(...) 手动分配新对象。
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多