我试图在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语句作为解决方法,可以执行此过程。
答案 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)