前段时间,我在这里提出了一个问题(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
一开始我以为可能会有尾随或前导空格,但事实并非如此。我不知道还有什么要解决的问题。任何见解都会很棒。预先感谢。
答案 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
}))