[英]R assign variable types to large data.frame from vector
我有一个宽的data.frame
,它是所有字符向量( df1
)。 我有一个单独的vector
( vec1
),其中包含要分配给df1
每个列的列类。
如果使用的是read.csv()
,我将使用colClasses
参数并将其设置为vec1
,但对于现有的data.frame
似乎没有类似的选择。
除了循环之外,还有什么建议可以快速实现此目的?
我不知道这是否会有帮助,但是我多次遇到相同的需求,并且创建了一个函数以防万一:
reclass <- function(df, vec){
df[] <- Map(function(x, f){
#switch below shows the accepted values in the vector
#you can modify it and/or add more
f <- switch(f,
as.is = 'force',
factor = 'as.factor',
num = 'as.numeric',
char = 'as.character')
#takes the name of the function and fetches the function
f <- get(f)
#apply the function
f(x)
},
df,
vec)
df
}
它使用Map
将类的向量传递给data.frame
。 每个元素对应于该列的类。 数据帧和向量的长度必须相同。
我也在使用switch
来使相应的类更短一些。 使用as.is
来保持类的相同,其余的我都可以自我解释。
小例子:
df1 <- data.frame(1:10, letters[1:10], runif(50))
> str(df1)
'data.frame': 50 obs. of 3 variables:
$ X1.10 : int 1 2 3 4 5 6 7 8 9 10 ...
$ letters.1.10.: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ runif.50. : num 0.0969 0.1957 0.8283 0.1768 0.9821 ...
和之后的功能:
df1 <- reclass(df1, c('num','as.is','char'))
> str(df1)
'data.frame': 50 obs. of 3 variables:
$ X1.10 : num [1:50] 1 2 3 4 5 6 7 8 9 10 ...
$ letters.1.10.: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ runif.50. : chr [1:50] "0.0968757788650692" "0.19566105119884" "0.828283685725182" "0.176784737734124" ...
我猜Map在内部是一个循环,但它是用C
编写的,因此应该足够快。
可能您可以尝试执行相同功能的此功能。
reclass <- function (df, vec_types) {
for (i in 1:ncol(df)) {
type <- vec_types[i]
class(df[ , i]) <- type
}
return(df)
}
这是vec_types(类型的向量)的示例:
vec_types <- c('character', rep('integer', 3), rep('character', 2))
您可以通过此表(df)测试函数(重分类):
table <- data.frame(matrix(sample(1:10,30, replace = T), nrow = 5, ncol = 6))
str(table) # original column types
# apply the function
table <- reclass(table, vec_types)
str(table) # new column types
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.