将类向量应用于数据帧

时间:2017-02-20 04:14:05

标签: r dataframe shiny

我有一个类的字符向量,我想将它应用于数据帧,以便将该数据帧中每个字段的当前类转换为向量中的相应条目。例如:

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循环

1 个答案:

答案 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")