【问题标题】:Applying if statements to for loops将 if 语句应用于 for 循环
【发布时间】:2015-05-04 11:42:54
【问题描述】:

我正在尝试在 for 循环中使用 if 语句来比较数据框的两列的值。此处显示了我的数据框中三个相关向量的示例。

HA
1.2
1.2
1.5
0.547502826
1.7
2.4
1.2846
0.5
0.466394974

HB
11.5,
10.5,
10.95,
0.547502826,
7.6,
6.7,
3.547,
3.85,
3.346972572,

HC
13.75,
11.55,
14.95,
0.547502826,
15.9,
11.05,
5.341,
3.75,
4.545342419,

我希望循环执行的是删除 HA 和 HB 具有相同编号的行。我尝试使用这部分代码从此处显示为对象“数据”的数据框中删除这些行。

for(i in rmvalue){
if(as.numeric(rmvalue[i,"HA"])==as.numeric(rmvalue[i,"HB"])){
  data<<-rmvalue[-i,]
} 

然而,R 似乎只评估数据框中的第一个表达式。不确定如何继续,或者是否可以在没有 if 语句的情况下执行此过程作为解决方法。

【问题讨论】:

  • 试试data&lt;-rmvalue[rmvalue[,"HA"]!=rmvalue[,"HB"],]
  • R 不是 Java。它是一种矢量化语言。我建议阅读一些 R 教程。起初这会花费一些时间,但将来会为您省去很多不必要的麻烦。
  • 感谢大家的反馈!实际上,我只是刚刚完成了 Robert Knell 的“Introductory R”和 Coursera 的“Data Scientist's Toolbox”和“R-Programming”,才真正开始接触编程。我必须承认,我也曾为了乐趣而使用 Codecademy 涉足 Java,这可能让我感到困惑。找到工作的乐趣,但有时也非常困难,因为办公室里没有其他人使用 R。为开源社区干杯!

标签: r if-statement for-loop


【解决方案1】:

正如大卫所说,你没有正确使用 R,这会使更具挑战性的问题看起来不可能。

为了尝试回答您的问题,我会快速写下以下内容,假设您有您的data.frame,如下所示。

D=data.frame(
 HA=c(1.2,1.2,1.5,0.547502826,1.7,2.4,1.2846,0.5,0.466394974),
 HB=c(11.5,10.5,10.95,0.547502826,7.6,6.7,3.547,3.85,3.346972572),     
 HC=c(13.75,11.55,14.95,0.547502826,15.9,11.05,5.341,3.75,4.545342419)
)

result <- D[D$HA!=D$HB,]

希望这指向一个更好的方向。

【讨论】:

    【解决方案2】:

    正如其他评论员所指出的,您说的是带有 Java 口音的 R,但这还不错!每个从另一种语言学习 R 的人都会经历类似的事情,因为你将旧的心智模型应用于新语言。通常 R 不喜欢循环和奖励矢量化解决方案。在这种情况下,子集化是一种快速而简洁的工作方式:

    D=data.frame(
          HA=c(1,1.2,1.5,0.547502826,1.7,2.4,1.2846,0.5,0.466394974),
          HB=c(1.5,10.5,10.95,0.547502826,7.6,6.7,3.547,3.85,3.346972572),     
          HC=c(13.75,11.55,14.95,0.547502826,15.9,11.05,5.341,3.75,4.545342419)
        )
    
    D2 <- D[ D$HA != D$HB, ]
    

    也就是说,在底层,R 正在运行一个循环,只是该循环是用一种性能更高的语言编写的。因此,有时编写循环实际上有助于理解编写循环,尽管您应该尽量不要在实际代码中使用它们。对于你的例子,我想我会把它写成这样的循环:

    library(dplyr) # for bind_rows    
    list <- vector(mode = "list", length = length(D$HA))
    
    for(i in seq_along(D$HA)){
      if(as.numeric(D[i,"HA"])!= as.numeric(D[i,"HB"])){
        list[[i]] <- D[i, ]
      }
    }
    
    D2 <- bind_rows(list)
    

    基本上,这只是一种更长、更慢的子集方式,但它是许多 R 代码基础的一种形式。这基本上就是lapply() 正在做的事情。

    【讨论】:

      【解决方案3】:

      @Nikos 答案的替代方法是使用dplyr。我建议使用这个包,因为它使那些刚接触 R 和矢量化 (IMO) 的人更容易理解语法

      install.packages("dplyr")
      require("dplyr")
      HA <- c(1.2, 1.2, 1.5, 0.547502826, 1.7, 2.4, 1.2846, 0.5, 0.466394974)
      HB <- c(11.5, 10.5, 10.95, 0.547502826, 7.6, 6.7, 3.547, 3.85, 3.346972572)
      HC <- c(13.75, 11.55, 14.95, 0.547502826, 15.9, 11.05, 5.341, 3.75, 4.545342419)
      d <- data.frame(HA, HB, HC)
      d1 <- filter(d, HA != HB)
      

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-07
        • 2016-06-16
        • 2019-06-09
        相关资源
        最近更新 更多