比较R中的两个字符串元素

时间:2013-12-30 21:52:12

标签: r statistics

我想比较R中的两个字符串元素。两个元素的str()函数给了我:

> (str(announcmentDate))
 chr "24.08.2009"
NULL
> (str(totalReturnsOfCompanyData$Date))
 chr [1:3036] "01.01.2002" "02.01.2002" "03.01.2002" "04.01.2002" ...
NULL
> 

我试过了:

> for (i in totalReturnsOfCompanyData$Date) {
+   if (totalReturnsOfCompanyData$Date[i]==announcmentDate[1]) {
+       
+       print("YUPIDUUUUUUUUUS")        
+   }
+ }
Error in if (totalReturnsOfCompanyData$Date[i] == announcmentDate[1]) { : 
  missing value where TRUE/FALSE needed

为什么我收到此错误? R中是否有一个equal函数(比如java中)来表明字符串相等?

感谢您的回答!

更新

我正在使用for循环,因为我稍后需要索引来从数据中提取子样本。

当我尝试:

> for (i in totalReturnsOfCompanyData$Date) {
+   if (na.omit(totalReturnsOfCompanyData$Date[i])==announcmentDate[1]) {
+       
+   #   eventWindow120Before <-
+   #   eventWindow120After  <-
+       print("YUPIDUUUUUUUUUS")        
+   }
+ }
Error in if (na.omit(totalReturnsOfCompanyData$Date[i]) == announcmentDate[1]) { : 
  argument is of length zero

为什么我会收到此错误?

4 个答案:

答案 0 :(得分:3)

看起来你的totalReturns数据框中有一些NA。您可以使用以下代码更轻松地执行此操作:

announcmentDate =  c("24.08.2009")
totalReturnsOfCompanyData_Date = strsplit("01.01.2002 02.01.2002 03.01.2002 04.01.2002 24.08.2009 NA"," ")[[1]]

获得两者相交的4种方法:

subset(totalReturnsOfCompanyData_Date, totalReturnsOfCompanyData_Date == announcmentDate)
totalReturnsOfCompanyData_Date[totalReturnsOfCompanyData_Date == announcmentDate]
totalReturnsOfCompanyData_Date[which(totalReturnsOfCompanyData_Date %in% announcmentDate)]
intersect(totalReturnsOfCompanyData_Date, announcmentDate)

如果您的日期存在,则打印一些内容(na.rm = TRUE将忽略NAs)

if(any(totalReturnsOfCompanyData_Date == announcmentDate, na.rm=TRUE))
{ print("Has it")  }

如果您需要实际指数:

which(totalReturnsOfCompanyData_Date %in% announcmentDate)

很少需要在R中进行任何循环,您可以使用上面的where语句获取索引。我注意到你也在使用事件Windows。如果他们正在滚动你可能想要检查rollapply我相信在MASS包中进一步摆脱任何循环。

答案 1 :(得分:1)

可能出现的问题是totalReturnsOfCompanyData$date向量中存在NULL值,这些值不适用于if语句。您只需使用NULL删除na.omit即可。

此外,不需要for循环,您可以使用矢量化:

s = "24.08.2009"
l = c("01.01.2002", "02.01.2002", "03.01.2002", "24.08.2009", NA)
s == l
[1] FALSE FALSE FALSE  TRUE  NA
which(s == l)
[1] 4

请注意,此解决方案无法使用na.omit,因为NA被解释为FALSE

答案 2 :(得分:1)

我猜你是正确的方式! 但是:如果构造(totalReturnsOfCompanyData$Date[i]==announcmentDate[1])必须导致NA,则对您进行合同评估。 - 由于条件需要1或0(真或假),您将收到错误。 na.omit()可以帮助您解决此问题!

  

处理对象中的缺失值:“这些泛型函数对于处理例如数据帧中的NA非常有用。如果对象不包含任何缺失值,则返回该对象,否则发出错误信号.na.omit返回删除了不完整案例的对象.na.pass返回对象不变。“(1)http://stat.ethz.ch/R-manual/R-patched/library/stats/html/na.fail.html

答案 3 :(得分:0)

首先,For循环不是R中的最佳方法。您应该使用向量化。

如果你想因任何原因使用For循环,For循环遍历日期对象而不是数字。在循环中,变量i是循环的元素,而不是您认为的索引。因此,我相信你应该输入

if (i==announcmentDate[1]) {

而不是

if (totalReturnsOfCompanyData$Date[i]==announcmentDate[1]) {