我想比较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
为什么我会收到此错误?
答案 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]) {