在 if 语句中定义对象/数据帧

Defining objects/dataframes in if statement

提问人:AlexisH 提问时间:7/27/2023 最后编辑:AlexisH 更新时间:7/28/2023 访问量:39

问:

我正在尝试组合两个数据帧并使用以下代码。我遇到的问题是,对于 rbind,它实际上只是在最后一行的每一列中添加“Hello World”。我实际要做的是,如果列名称中的 i 是“Hello World”,请将该行添加到 newlist 中。

我意识到更多的背景可能会有所帮助,但我真的只是想弄清楚这个错误。我仍在学习 R,任何建议都会有所帮助。

MasterList <- function(group1, group) {
  first <- data.frame(group1)
  second <- data.frame(group)
  for (x in first$Name) {
    for (y in second$Name) {
      if (x != y) {
        newlist <- first[first$Name %in% second$Name, ] 
      }
    }
  }
  for (x in first$Name) {
    for (y in second$Name) {
      if (x == "Hello World") {
        NL <- rbind(newlist, i)     
      }
    }
    return(NL)
  }

输出是

标头 另一个标题
第一 第 1 行
第二 第 2 行
世界您好 世界您好

但我希望输出是

标头 另一个标题
第一 第 1 行
第二 第 2 行
世界您好 第 3 行
r 函数 for-loop 对象

评论

2赞 r2evans 7/27/2023
你们的名字是不同的。你清楚地定义了一个分支和另一个分支。块完成后,您将拥有其中之一已定义,而不是两者兼而有之。这就是“经典 CS”:如果你在代码中的任何位置引用一个变量,它必须在该点之前的某个地方定义。你定义的内容取决于你打算如何使用它。顺便说一句:迭代是一个非常坏的习惯,我强烈建议你不要这样做。newlistNLifnewlistNLrbind
0赞 AlexisH 7/28/2023
@r2evans 对于没有 rbind 迭代地附加数据帧,您有什么建议吗?另外,如果您对我更新的困境有任何建议,我将不胜感激。
0赞 r2evans 7/28/2023
(1) .最后一个表达式可以替换为 和 ,两者都比第一个表达式更健壮、更灵活。(2) 不可以。问题已确定,您有条件地创建变量,然后无条件地引用它们。即使您可以绕过“尚未定义”的部分,您的电流似乎也很有可能从循环的前一部分附加 a。我无法遵循您需要的逻辑lst <- list(); for (...) { ...; lst <- c(lst, list(newframe)); }; out <- do.call(rbind, lst)dplyr::bind_rows(lst)data.table::rbindlist(lst)rbind(newlist, i)newlist
0赞 r2evans 7/28/2023
更困难的是,AlexisH,这个问题是不可重现的:我不知道你怎么称呼它,你的输入数据是什么,等等。它可能会帮助你使它成为一个独立的可重复的问题,请通读 stackoverflow.com/q/5963269最小的可重复的例子,并 stackoverflow.com/tags/r/info 围绕这一点进行一些讨论。底线:如果您无法启动一个新的 R 实例并运行问题中的所有数据/代码而不会出现 之类的错误,那么它就不是 reprex。object not found
0赞 AlexisH 7/28/2023
@r2evans 从本质上讲,我试图删除第一个数据帧中“name”列与第二个数据帧不并发的每一行。该部分工作正常,然后在下一个 for 循环块中,我试图说第二个数据帧的 name 列中的条目是否为 Hello world,将其添加到新数据帧中。我希望这是有道理的。

答: 暂无答案