1

这是我的示例数据集

> 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

4

2 回答 2

0

您的问题具体而言涉及 and 的for用法if。这是我的方法:

  • 您可以定义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 只使用一个&for and(并且只使用一个|for or),所以你的if陈述应该是这样的:

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

最后,如果您想调试代码,请查看此链接

于 2014-06-24T15:44:15.097 回答
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"

于 2014-06-24T13:59:42.987 回答