创建一个将数据框的每个字符列转换为因子1的函数

时间:2013-02-13 20:06:59

标签: r

我创建了以下函数来将数据帧(x)的每个字符列转换为因子1,但是我收到错误消息“错误if if(e [i]){:参数不是可解读为逻辑。“任何帮助将不胜感激。

f<-function(x){
e<-lapply(x, is.character)
i <- 1
while (i >= 1) {
if(e[i]) {as.factor(x[[i]])}
else {x[i]}
}
x
}

3 个答案:

答案 0 :(得分:4)

您可以使用:

char2factor <- function(df) {
  data.frame(lapply(df, function (v) {
    if (is.character(v)) factor(v)
    else v
  }))
}

例如,如果您有以下数据:

df <- data.frame(v1=LETTERS[1:5],v2=1:5,stringsAsFactors=FALSE)
df
#   v1 v2
# 1  A  1
# 2  B  2
# 3  C  3
# 4  D  4
# 5  E  5
lapply(df, class)
# $v1
# [1] "character"
# 
# $v2
# [1] "integer"

你会得到:

char2factor(df)
#   v1 v2
# 1  A  1
# 2  B  2
# 3  C  3
# 4  D  4
# 5  E  5
lapply(char2factor(df), class)
# $v1
# [1] "factor"
# 
# $v2
# [1] "integer"

答案 1 :(得分:3)

修改 Per Joran的评论(这可以在一个简洁的行中完成):

使用:

data.frame(lapply(dat, "["), stringsAsFactors = TRUE)

在上下文中:

#make fake data
dat <- data.frame(w = state.abb [1:10], x=LETTERS[1:10], y=rnorm(10), 
   z =1:10, stringsAsFactors = FALSE)
str(dat)

dat2 <- data.frame(lapply(dat, "["), stringsAsFactors = TRUE)
str(dat2)

这是我认为我会采取的方法(编辑 - 不再):

FUN <- function(x) {
    if (is.character(x)) {
        x <- as.factor(x)
    }
    x
}

for(i in seq_along(inds)) {
    dat[, i] <- FUN(dat[, i])
}

str(dat)

答案 2 :(得分:1)

使用colwise中的plyr,您可以

    dat <- colwise(function(x) {
                        if(is.character(x)) as.factor(x) else x
                    })(dat)