【问题标题】:Compare two string elements in R比较R中的两个字符串元素
【发布时间】:2013-12-30 21:52:11
【问题描述】:

我想比较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

为什么会出现这个错误?

【问题讨论】:

  • 输入 (str(announcmentDate[1])) 会得到什么输出
  • @user3116916 我收到了&gt; (str(announcmentDate[1])) chr "24.08.2009" NULL
  • 和 (str(totalReturnsOfCompanyData$Date[1]))
  • @user3116916 我收到了&gt; (str(totalReturnsOfCompanyData$Date[1])) chr "01.01.2002" NULL
  • 您收到 argument of length zero 错误,因为您删除了 if 语句中的 NA,导致内容为空。您需要在进入循环之前从源数据中删除 NA。但是,首先不需要循环,请参阅我的答案。

标签: r statistics


【解决方案1】:

您的 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 将忽略 NA)

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

如果您需要实际的索引:

which(totalReturnsOfCompanyData_Date %in% announcmentDate)

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

【讨论】:

    【解决方案2】:

    问题可能是您的totalReturnsOfCompanyData$date 向量中有NULL 值,这不适用于if 语句。您可以使用na.omit 简单地删除NULL

    另外,不需要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

    【讨论】:

    • 感谢您的回答!但是现在我得到了一个不同的错误!请查看我的更新。
    • 如果你使用我的矢量化方法,你的错误将会消失。
    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢您的回答!我试过了,但是我遇到了另一个错误。请看我的更新!
    • 在进入 for 循环之前,尝试让 na.omit() 函数作用于 announcmentDate 和 totalReturnsOfCompanyData!
    【解决方案4】:

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

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

    if (i==announcmentDate[1]) {
    

    而不是

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

    【讨论】:

    • 这没有意义,比较应该在两个日期之间,而不是在日期和索引之间。
    • 是的,但是用户正在循环访问 Date 中的对象,所以 i 是日期本身。尝试一下。 for (i in Date) { + print(i) + }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2013-02-08
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多