在具有书面功能的列的子集上使用 lapply?
Use lapply on subset of columns with written function?
我有一个数据集,其中某些列是字符形式的日期。
日期格式不一致,存在缺失数据。我写了一段代码以正确的格式转换它们。
如果我将每一列的代码与 lapply 一起使用,我没有问题。
当我尝试同时将函数实现到多个列时,代码会出现以下错误:Error in lout[w] <- *vtmp* :
NAs are not allowed in subscripted assignments
guess_date <- function(x){
require(lubridate)
if (!is.na(x)){
result <- as.character(parse_date_time(x,
guess_formats(as.character(x), c("mdy", "dmy", "dmY")))[[1]])
}
else {result <- NA}
return(result)
}
df <- data.frame(a = c("12/01/1988","10/17/1999"),b =
c("12/01/1988",NA))
df$a <- unlist(lapply(df$a , guess_date))
df$a<- as.Date(df$a, format="%Y-%m-%d")
cols <- c("a","b")
df[,cols] <- lapply(df[,cols], function(x){
require(lubridate)
if (!is.na(x)){
result <- as.character(parse_date_time(x,
guess_formats(as.character(x), c("mdy", "dmy", "dmY")))[[1]])
}
else {result <- NA}
return(result)
})
不确定我是否遗漏了什么,但看起来你有很多不必要的代码。这工作正常
library(lubridate)
df[cols] <- lapply(df[cols], parse_date_time, c("mdy", "dmy", "dmY"))
df
# a b
#1 1988-12-01 1988-12-01
#2 1999-10-17 <NA>
此外,df
中的所有日期似乎都遵循相同的 format
,因此 as.Date
也可以正常工作。
df[] <- lapply(df, as.Date, "%m/%d/%Y")
数据
df <- data.frame(a = c("12/01/1988","10/17/1999"),b = ("12/01/1988",NA))
这里有一个选项anytime
library(dplyr)
library(anytime)
df %>%
mutate_all(anydate)
# a b
#1 1988-12-01 1988-12-01
#2 1999-10-17 <NA>
数据
df <- data.frame(a = c("12/01/1988","10/17/1999"),
b = c("12/01/1988",NA))
我有一个数据集,其中某些列是字符形式的日期。
日期格式不一致,存在缺失数据。我写了一段代码以正确的格式转换它们。
如果我将每一列的代码与 lapply 一起使用,我没有问题。
当我尝试同时将函数实现到多个列时,代码会出现以下错误:Error in lout[w] <- *vtmp* :
NAs are not allowed in subscripted assignments
guess_date <- function(x){
require(lubridate)
if (!is.na(x)){
result <- as.character(parse_date_time(x,
guess_formats(as.character(x), c("mdy", "dmy", "dmY")))[[1]])
}
else {result <- NA}
return(result)
}
df <- data.frame(a = c("12/01/1988","10/17/1999"),b =
c("12/01/1988",NA))
df$a <- unlist(lapply(df$a , guess_date))
df$a<- as.Date(df$a, format="%Y-%m-%d")
cols <- c("a","b")
df[,cols] <- lapply(df[,cols], function(x){
require(lubridate)
if (!is.na(x)){
result <- as.character(parse_date_time(x,
guess_formats(as.character(x), c("mdy", "dmy", "dmY")))[[1]])
}
else {result <- NA}
return(result)
})
不确定我是否遗漏了什么,但看起来你有很多不必要的代码。这工作正常
library(lubridate)
df[cols] <- lapply(df[cols], parse_date_time, c("mdy", "dmy", "dmY"))
df
# a b
#1 1988-12-01 1988-12-01
#2 1999-10-17 <NA>
此外,df
中的所有日期似乎都遵循相同的 format
,因此 as.Date
也可以正常工作。
df[] <- lapply(df, as.Date, "%m/%d/%Y")
数据
df <- data.frame(a = c("12/01/1988","10/17/1999"),b = ("12/01/1988",NA))
这里有一个选项anytime
library(dplyr)
library(anytime)
df %>%
mutate_all(anydate)
# a b
#1 1988-12-01 1988-12-01
#2 1999-10-17 <NA>
数据
df <- data.frame(a = c("12/01/1988","10/17/1999"),
b = c("12/01/1988",NA))