我有一个从sqlite数据库表创建的R数据帧。此数据具有许多日期时间列,现在是字符列。我想将它们大量转换为数据框中的日期列。
我可以像这样一次完成一个专栏:
loan$Maturity <- as.Date(gsub(', 12:00:00 AM', '', loan$Maturity), "%m/%d/%y")
我可以为所有作为因子的列进行批量更新。作为日期值的每一列都包含
i <- sapply(loan, is.factor)
loan[i] <- lapply(loan[i], as.character)
如何获取包含文本“,12:00:00 AM”的每个列,然后使用函数as.Date()更改所有字段,以将所有字符值转换为日期值。
答案 0 :(得分:0)
此解决方案假设(正如@Tim所要求的)列中的struct A {
virtual void f(int a = 7);
};
struct B : public A {
void f(int a);
};
void m() {
B* pb = new B;
A* pa = pb;
pa->f(); // OK, calls pa->B::f(7)
pb->f(); // error: wrong number of arguments for B::f()
}
的单个实例构成转换。
我提供了两个执行检查和转换的版本。第一个使用, 12:00:00 AM
查找要转换的列,然后在vapply
中转换它们。第二个版本使用单个lapply
进行检查和转换。
lapply
如果列中的每个元素都必须包含#create dummy data.frame
df <- data.frame(a=1, b='1/1/92, 12:00:00 AM')
#check which columns have ', 12:00:00 AM' in them
convertCols <- vapply(df, function(col) sum(grepl(', 12:00:00 AM', col)) > 0, logical(1))
#convert only columns that contained ', 12:00:00 AM' using your conversion function
df[convertCols] <- lapply(df[convertCols], function(dates) as.Date(gsub(', 12:00:00 AM', '', dates), "%m/%d/%y"))
#create dummy data.frame
df <- data.frame(a=1, b='1/1/92, 12:00:00 AM')
#done in single lapply
df[] <- lapply(df[], function(col) {
if(sum(grepl(', 12:00:00 AM', col)) > 0) as.Date(gsub(', 12:00:00 AM', '', col), "%m/%d/%y") else col
})
来构成转换,那么检查将切换为, 12:00:00 AM
而不是sum(grepl(', 12:00:00 AM', col)) == length(col)