2013-05-01 66 views
3

我R中全新的,有以下问题: 我想创建一个新列V4以字母A仅在V2的值大于或等于1.2如何在循环中使用grepl()来计算值> = x?

这是我的测试数据帧DF:

V1 V2 V3 
1 ABC 1.2 4.3 
2 CFS 2.3 1.7 
3 dgf 1.3 4.4 

这就是我所做的

df$V4<-NA 

for(i in 1:nrow(df)) { 
xy=df[i,]$V2 
if (grepl(>=1.2,xy)) 
df[i,]$V4 ="A"  
} 
} 

它正常工作时,我只是想正是1.2,但> =似乎不起作用。 有没有人知道为什么?

+0

欢迎SO和这里的'R'社会!由于您是新手,因此您可能会发现阅读[** about **](http://stackoverflow.com/about)和[** faq **](http://stackoverflow.com/faq )关于SO如何工作以充分利用网站。 – 2013-05-01 09:42:37

回答

3

ifelse似乎在这种情况下适当的:

df$V4 <- ifelse(df$V2 >= 1.2 , "A" , NA) 

这会给NA那些不是>=至1.2的值。在您的例子df$V2所有值大于或等于1.2等你拿:

df 
# V1 V2 V3 V4 
#1 ABC 1.2 4.3 A 
#2 CFS 2.3 1.7 A 
#3 dgf 1.3 4.4 A 

但是,如果我们做一个值,该值小于1.2 ...

df 
# V1 V2 V3 
#1 ABC 1.2 4.3 
#2 CFS 2.3 1.7 
#3 dgf 1.0 4.4 

df$V4 <- ifelse(df$V2 >= 1.2 , "A" , NA) 
df 
# V1 V2 V3 V4 
#1 ABC 1.2 4.3 A 
#2 CFS 2.3 1.7 A 
#3 dgf 1.0 4.4 <NA> 

NA被斜角括号包围以表示它实际上是一个NA(缺失值等)而不是字符串'NA'

如果你在你的数据集大量行的再一个子集方法的比较和更换可能会更快:

df$V4 <- NA 
df$V4[ df$V2 >= 1.2 ] <- "A" 
+0

是[**这个答案**](http://stackoverflow.com/questions/16253789/what-is-the-difference-between-na-and-na/16253827#16253827)完全正确吗?这里'V4'栏是字符类型,我们仍然可以在NA附近得到尖括号。 – Arun 2013-05-01 09:45:06

+0

非常感谢!正是我需要的。直截了当的代码。 – RNewbi 2013-05-01 20:44:02