簡體   English   中英

在data.table R中使用lapply填充不適用的NA列

[英]column full of NA using lapply in a data.table R

我在lapply中使用lapply有問題。 這是兩個示例:

library(data.table)
 library(lubridate)

test <- function(x) 
{
  if(is.na(x)) return(NA)
  if(x=="") return(NA)
  if(substr(x,3,3)=="/") return(as_date(x,"%d/%m/%Y"))
  return(2)
}

x1<-data.table(v1=c("","07/06/2016","",NA), v2=c("2004-06-18","","2004-06-18","2004-06-18"))
x1[,lapply(.SD,test)]

x2<-data.table(v1=c("2004-06-19","2004-06-18","",NA),v2=c("2004-06-18","","2004-06-18","2004-06-18"))
x2[,lapply(.SD,test)]

在第一個示例中, lapply之后的第一列充滿了NA ,但我想獲取的是NA, 2016-06-07, NA, NA

在第二個示例中,第一列的最后兩行是錯誤的,因為每行包含2,但我認為應該包含NA

我不明白R在這里如何考慮NA 我想得到我想要的東西嗎?

經過大量嘗試,答案是data.table將列視為變量,而.SD是一個列表,其元素是列作為變量,因此在應用函數時(如此處測試),該函數必須將a作為參數清單。

這是您應該更改的內容:

testList <- function(x) 
{
  lapply(x,test)
}

x1[,lapply(.SD,testList)]

如果有人知道其他解決方案,請隨時分享。

首先,我不能在沒有拋出錯誤的情況下運行您的示例。 data.tables的第二列屬於“日期”類,但""項不是日期。 打印時,其格式看起來像NA 嘗試運行is.na(x1$v2[2])x1$v2[2] == ""

同樣,您似乎在向量化方面遇到了問題。

嘗試運行test(x1$v1) 請注意警告消息。 is.na(x)返回邏輯向量,但是if僅使用向量中的第一個元素。

In addition: Warning message:
In if (is.na(x)) return(NA) :
  the condition has length > 1 and only the first element will be used

您可能可以通過應用到每一行來修復它:

x1[, lapply(.SD, test), by = 1:nrow(x1)]

否則,您將需要修改test函數以接受字符串向量並返回結果向量。 但是,您實際上應該考慮返回單一類型的向量。

最后,在此示例中,我不了解lubridate的目的。 為什么不使用as.Date(x,"%d/%m/%Y") 您從as_date獲得什么?

編輯

您可以重寫函數以處理矢量:

test <- function(x) 
{
  ans <- rep.int(2, length(x))
  ans[is.na(x) | x == ""] <- NA
  dates <- grepl('../', x)
  ans[dates] <- as_date(x[dates], "%d/%m/%Y") 

  return(ans)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM