这是我的示例数据集
> 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)))
但我的任务是使用循环功能 - 可能是和
答案 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)
具体而言,您的问题涉及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中,起始索引是一个(与许多类C语言不同,起始索引通常为零)。
至于您的if
声明,R只使用&
and
|
只有一个or
,因此{{1}语句应该是这样的:
if
最后,如果您想调试代码,请检查this link。