我有一个巨大的数据框df
,在一列中有一个“年月”值,如下所示:“YYYYMM”。目前数据类型是数字。快照:
> df[[1]][1:10]
[1] 201001 201001 201001 201001 201001 201001 201001 201001 201001 201001
> str(df)
'data.frame': 2982393 obs. of 11 variables:
$ YearMonth : int 201001 201001 201001 201001 201001 201001 201001 201001 201001 201001 ...
$ ...
我想要的是将此值转换为“YYYY-MM”形式的字符串(最终转换为一个因子),以便能够将其与其他数据帧进行比较。
我正在努力寻找一种简单的方法来改变价值。
我尝试使用as.Date
和format
功能。但是由于这些值没有任何日期,因此它不适用于字符串。使用 Numerics(与数据框列相同)我什至遇到了其他问题。
> as.Date("201001", format = "%Y%m")
[1] NA
> as.Date(201001, format = "%Y%m")
Error in as.Date.numeric(201001, format = "%Y%m") :
'origin' must be supplied
> as.Date(df[[1]], format = "%Y%m")
Error in as.Date.numeric(df[[1]], format = "%Y%m") :
'origin' must be supplied
我只能转换一个值,使用subset
和连接字符串。我写了下面的公式来处理一个元素:
transformString <- function( x ) { # x = value
return ( paste(cbind(substring(x, 1, 4),"-",substring(x,5,6)), collapse = '') )
}
问题:除了遍历所有元素之外,我没有找到一种简单的方法将该函数应用于 data.frame 的整个列:
transformStringVector <- function( x ) { # x = vector
for(i in 1:length(x)) {
x[i]<-transformString(x[i])
}
return ( x )
}
这远非优雅且不利于性能。我尝试使用apply
(见下文)和类似的东西,但遇到了错误......(我承认我并没有真正得到这个apply
功能)
> temp <- apply(df[[1]], 1, transformString )
Error in apply(df[[1]], 1, transformString ) :
dim(X) must have a positive length
在巨大的 data.frame 中,是否有人可以替代这种转换?或更笼统地说;将类似字符串的转换应用于 data.frame 中的元素的简单方法?