很多人似乎都有这个问题但是我找不到令人满意的答案。如果你放纵我,我想确定了解发生了什么
我在数据框中有各种格式的日期(也是常见问题)所以我已经构建了一个小函数来为我处理它:
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次回答此问题。
尼古拉斯
答案 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))