R中的字符串比较未返回正确的数据结果

时间:2019-03-05 13:58:53

标签: r string comparison

前段时间,我在这里提出了一个问题(this问题),并且回答正确。基本上,我需要将一个特定列的值转换为新列,具体取决于姊妹列。

我尝试使用相同的逻辑在新情况下使用数据获取不同的值。现在的问题似乎是R或函数在进行比较时无法识别数据框中的正确值。

有问题的功能如下:

    Obtain_SD <- function(df,dfx,atr,country){

      df <- dplyr::left_join(df,dfx,by=c("cd85"="cd")) //dfx has the DAR and DAT columns

      DAR_cols <- grep("DAR",colnames(df))
      DAT_cols <- grep("DAT",colnames(df))

      df$ex90 <- df[DAT_cols][cbind(1:nrow(df),max.col(df[DAR_cols] == "90"))]
      return(df)
    }

根据此行:

df$ex90 <- df[DAT_cols][cbind(1:nrow(df),max.col(df[DAR_cols] == "90"))]

程序在DAR_cols中找到带有相应DAT_cols的值的“ 90”时,应添加一列。在大多数情况下,这种方法都可以正常工作,但是会发生这种情况:

Browse[2]> df[422,"ex90"]
[1] NA

如果我运行一些检查命令,则会得到以下答案:

Browse[2]> typeof(df[422,"DAR04"])
[1] "character"
Browse[2]> df[422,"DAR04"]
[1] "90"
Browse[2]> df[422,"DAR04"] == "90"
[1] TRUE

列DAR04(根据summary(df)命令)属于类character和方式character,但是代码返回该行以及其他一些代码(我将命令的格式更改为可读性):

   ID CD    DATA DAR01 DAT01    ... DAR04 DAT04    ... DAR12 DAT12 ex90
   7  99034 ...  1     19000101 ... 90    20140715 ... NA    ""    NA

一开始我以为可能会有尾随或前导空格,但事实并非如此。我不知道还有什么要解决的问题。任何见解都会很棒。预先感谢。

1 个答案:

答案 0 :(得分:1)

由于NA中有一些max.col(df[DAR_cols] == "90"),因此您正在通过NAs继承DAR_cols。例如。在您打印的示例中,DAR12似乎是NA

我也不完全确定您是否真的想使用max.col(..., ties.method = "last")。默认值为ties.method = "random"

您可以将max.col(df[DAR_cols] == "90")替换为处理apply的自定义NAs

unname(apply(df[DAR_cols] == "90", 1, function(x) {
  res <- which(x)
  if (length(res) == 0) res <- NA
  if (length(res) > 1) res <- max(res) # or use min(res) if you rather want the first
  res
}))