【问题标题】:How can I use loops for and if如何使用循环 for 和 if
【发布时间】:2014-08-14 19:43:06
【问题描述】:

这是我的示例数据集

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

但我的任务是使用循环函数 - 可能是 for 和 if

【问题讨论】:

  • Barranka 你必须相信我这不是家庭作业。你能帮我在循环中改变功能吗?
  • 我曾尝试使用 mapreduce(我写了其他关于此的问题,但人们不明白我的意图)。更何况我不能在mapreduce函数tapply中使用,我必须使用循环。

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


【解决方案1】:

这听起来像是家庭作业。但是for 循环会遍历in 右侧向量中的所有元素。这也意味着您的for 循环将自动递增,因此您不需要i &lt;- 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)。我没有检查你的代码,只有你的forsyntax。 请记住,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"

【讨论】:

  • 感谢这个建议(我在我的代码中更改了这段代码),但仍然无法编写此代码...
【解决方案2】:

您的问题具体涉及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 中,起始索引为 1(与许多类似 C 的语言不同,起始索引通常为零)。

至于你的if 语句,R 只使用一个&amp; 来表示and(并且只使用一个| 来表示or),所以你的if 语句应该是这样的:

if(old_id == a[1,i+2] & old_art == a[i+2,1]) {
    # More code here
}

最后,如果要调试代码,请查看this link

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多