我有一个类的字符向量,我想将它应用于数据帧,以便将该数据帧中每个字段的当前类转换为向量中的相应条目。例如:
frame <- data.frame(A = c(2:5), B = c(3:6))
classes <- c("character", "factor")
使用for循环,我知道这可以使用lapply完成。例如:
for(i in 1:2) { frame[i] <- lapply(frame[i], paste("as", classes[i], sep = ".")) }
然而,就我的目的而言,for循环不起作用。我还缺少另一种解决方案吗?
提前感谢您的意见!
注意:我被告知这可能与this post重复。而且,是的,我的问题与此类似。但我之前看过class()方法。它似乎没有有效地处理将字段转换为因子。另一方面,lapply方法做得很好。但是,遗憾的是,在这种情况下我无法使用for循环
答案 0 :(得分:0)
如果您不反对在没有lapply
循环的情况下使用for
,您可以尝试以下内容。
frame[] <- lapply(seq_along(frame), function(x) {
FUN <- paste("as", classes[x], sep = ".")
match.fun(FUN)(frame[[x]])
})
str(frame)
# 'data.frame': 4 obs. of 2 variables:
# $ A: chr "2" "3" "4" "5"
# $ B: Factor w/ 4 levels "3","4","5","6": 1 2 3 4
但是,更好的选择是在您开始阅读数据时尝试应用正确的类。
x <- tempfile() # Just to pretend....
write.csv(frame2, x, row.names = FALSE) # ... that we are reading a csv
frame3 <- read.csv(x, colClasses = classes)
str(frame3)
# 'data.frame': 4 obs. of 2 variables:
# $ A: chr "2" "3" "4" "5"
# $ B: Factor w/ 4 levels "3","4","5","6": 1 2 3 4
示例数据:
frame <- frame2 <- data.frame(A = c(2:5), B = c(3:6))
classes <- c("character", "factor")