【问题标题】:Update Data Frame through nested functions in R通过 R 中的嵌套函数更新数据框
【发布时间】:2017-02-22 00:34:42
【问题描述】:

我的程序遇到的问题有一个可重现的小版本。

我的代码结构涉及嵌套函数,类似于下图,只是更复杂。

x <- data.frame(c(1:5),c(0))
colnames(x) <- c("val1", "val2")

foo <- function() {
  for(i in 1:length(x[,1])) {
    bar(i)
  }
  print(x)
}

bar <- function(i) {
   if(x[i,2] == 0) {
    x[i,2] <- 1
    print(x[i,])
  }
  return(x)
}

>foo()
  val1 val2
1    1    1
  val1 val2
2    2    1
  val1 val2
3    3    1
  val1 val2
4    4    1
  val1 val2
5    5    1
  val1 val2
1    1    0
2    2    0
3    3    0
4    4    0
5    5    0

因此,正如结果所示,bar() 函数并未返回值以更新数据框。

为了将更新后的表返回给 foo() 函数,我需要进行哪些更改?

提前致谢。

【问题讨论】:

  • 你能简单解释一下你想要从你的函数中得到什么输出吗?我想我有一个答案,但我不太确定我知道你想要什么作为解决方案。
  • 感谢您的回复,我正在寻找一个更新的数据框 x,其中第 2 列的所有值都为 1。
  • 在一个更复杂的示例中,我希望您希望有条件地更改第二列?

标签: r


【解决方案1】:

最好将data.frame 作为参数传递,而不是将其硬编码到函数中。这里有一些修改应该可以完成您正在寻找的内容

foo <- function(df) {
  for(i in seq_len(nrow(df))) {
    df[i, ] <- bar(df[i, ])
  }
  print(df)
}

bar <- function(df) {
  if(df[, "val2"] == 0) {
    df[, "val2"] <- 1
    print(df[, ])
  }
  return(df)
}

> foo(x)
  val1 val2
1    1    1
  val1 val2
2    2    1
  val1 val2
3    3    1
  val1 val2
4    4    1
  val1 val2
5    5    1
  val1 val2
1    1    1
2    2    1
3    3    1
4    4    1
5    5    1

【讨论】:

  • 太好了,谢谢。这正是我一直在寻找的,我对自己没有找到解决方法感到失望。我说df[i, ] &lt;- bar(df[i, ]) 是存储更新的行是正确的吗?
  • 没错。原始函数在函数bar 中修改了x,但并未对调用环境foo 进行更改。这里有一些很好的信息:adv-r.had.co.nz/Environments.html
【解决方案2】:

所以我有点困惑为什么你需要编写一个函数来完成这个。到目前为止,最简单的解决方案就是有条件地对数据框进行子集化并分配值:

  x <- data.frame(c(1:5),c(0))
  colnames(x) <- c("val1", "val2")


  x$val2[x$val2==0]<-1

但是,如果这个答案过于简单,因为解决方案需要扩展,我怀疑嵌入其中一个应用函数可能会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2018-11-03
    • 2015-10-02
    • 2020-10-27
    • 2011-04-27
    相关资源
    最近更新 更多