データフレーム(x)のすべての文字列をファクター1に変換する次の関数を作成しましたが、「Error in 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
}
データフレーム(x)のすべての文字列をファクター1に変換する次の関数を作成しましたが、「Error in 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
}
使用できます:
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つの簡潔な行で行うことができます):
使用する:
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)
これは私が取ると思うアプローチです(EDIT -もうありません):
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)
colwise
fromを使用するplyr
と、次のことができます
dat <- colwise(function(x) {
if(is.character(x)) as.factor(x) else x
})(dat)