如果函数在dplyr :: mutate中:条件的长度为> 1

时间:2017-08-14 16:05:06

标签: r dplyr

很多人似乎都有这个问题但是我找不到令人满意的答案。如果你放纵我,我想确定了解发生了什么

我在数据框中有各种格式的日期(也是常见问题)所以我已经构建了一个小函数来为我处理它:

dateHandler <- function(inputString){
  if(grepl("-",inputString)==T){
    lubridate::dmy(inputString, tz="GMT")
  }else{
    as.POSIXct(as.numeric(inputString)*60*60*24, origin="1899-12-30", tz="GMT")
  }
}

在一个元素上使用它时效果很好:

myExample <-c("18-Mar-11","42433")

> dateHandler(myExample[1])
[1] "2011-03-18 GMT"
> dateHandler(myExample[2])
[1] "2016-03-04 GMT"

然而,当在整个列上使用它时,它不起作用:

myDf <- as.data.frame(myExample)
> myDf <- myDf %>% 
+   dplyr::mutate(dateClean=dateHandler(myExample))
Warning messages:
1: In if (grepl("-", inputString) == T) { :
  the condition has length > 1 and only the first element will be used
2:  1 failed to parse. 

通过在论坛上阅读,我目前的理解是R将带有myDf $ myExample的所有元素的向量传递给函数,该函数不是为处理长度为> 1的向量而构建的。如果这是正确的,下一步是了解从那里做什么。许多人建议使用ifelse而不是if,但我不明白这对我有什么帮助。另外我读到ifelse会返回与其输入格式相同的内容,在这种情况下这对我不起作用。

感谢您提前第10000次回答此问题。

尼古拉斯

1 个答案:

答案 0 :(得分:1)

你有两个选择,从哪里去。一种是使用let jsonData = """ { "18348b9b-9a49-4e04-ac35-37e38a8db1e2": { "isActive": false, "age": 29, "company": "BALOOBA" }, "20aca96e-663a-493c-8e9b-cb7b8272f817": { "isActive": false, "age": 39, "company": "QUONATA" }, "bd0c389b-2736-481a-9cf0-170600d36b6d": { "isActive": false, "age": 35, "company": "EARTHMARK" } } """.data(using: .utf8)! let entities = try JSONDecoder().decode(BoringEntities.self, from: jsonData).entities 将当前函数应用于列表。如:

lapply

另一种选择是构建一个矢量化函数,该函数旨在将矢量作为输入而不是单个数据点。这是一个简单的例子:

myDf$dateClean <- lapply(myDf$myExample, function(x) dateHandler(x))