将if语句应用于for循环

时间:2015-05-04 11:42:54

标签: r if-statement for-loop

我试图在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具有相同编号的行。我试图使用这部分代码将这些行从这里显示的数据框中删除为对象" data"。

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

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

3 个答案:

答案 0 :(得分:3)

正如大卫所说,你没有正确使用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,]

希望这指向更好的方向。

答案 1 :(得分:1)

正如其他评论员已经注意到你用Java口音说R,但那还不错!每个学习R语言形成另一种语言的人都会经历这样的事情,因为你将旧的心理模型应用于新语言。通常R不喜欢循环和奖励矢量化解决方案。在这种情况下,subseting是一种快速简洁的工作方式:

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()正在做的事情。

答案 2 :(得分:0)

@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)