如何使用循环和if

时间:2014-06-24 13:51:16

标签: r loops if-statement for-loop tapply

这是我的示例数据集

> a
  V1   V2
1 A1 5437
2 A1 5437
3 A1 5437
4 A2 1819
5 A2 1758
6 A2 1212
7 A2 1212
8 A3 1456

我想为列V2计算唯一值,因此结果将为:

A1 1
A2 3
A3 1

我已经开始编写我的代码,但我不知道 - 这应该是什么样的:

old_id <- a[1,2]
old_art <- a[2,1]
for (i in nrow(a)){
  if (old_id == a[1,i+2] && old_art == a[i+2,1]){
    new_id[i] <- old_id[1,i+2]
    new_art[i] <- i
  }
  i <- i+1
}

我知道非常简单的解决方案:

tapply(a[,2], a[,1], function(t) length(unique(t)))

但我的任务是使用循环功能 - 可能是和

2 个答案:

答案 0 :(得分:0)

这听起来像是家庭作业。但for循环遍历in右侧向量中的所有元素。这也意味着您的for循环会自动增加,因此您不需要i <- i+1

因此,您的for循环应该如下所示

for (i in 1:nrow(a)) {
  < your code >
}
# i <- i + 1 # No need for this!

注意i in 1:nrow(a)而不是i in nrow(a)。我还没有检查您的代码,只检查了for语法。 请记住,for循环只是函数;所以

for (i in 1:3) {
  print(i)
}
#[1] 1
#[1] 2
#[1] 3

相同
`for`(i, 1:3, print(i))
#[1] 1
#[1] 2
#[1] 3

请参阅?"for"

答案 1 :(得分:0)

具体而言,您的问题涉及forif的问题。这是我的方法:

  • 您可以用两种形式定义for:“经典C风格”和“矢量风格”。

“经典C风格”将是这样的:

for(i = 1; i <= nrow(a); i = i + 1) {
    # Your code goes here
}

“矢量风格”将是这样的:

for(i in 1:nrow(a)) {
    # Your code goes here
}

请注意,在这两种情况下,for语句都是增加i值的语句。另外,请记住,在R中,起始索引是一个(与许多类C语言不同,起始索引通常为零)。

至于您的if声明,R只使用& and |只有一个or,因此{{1}语句应该是这样的:

if

最后,如果您想调试代码,请检查this link