4

Rは、「間違った」形式のデータフレーム列を理解することがよくあります。または、列クラスを変更するには、列クラスを因数分解から文字に変更する必要があります。以前、次の方法で列クラスを変更しました。

set.seed(1)

df <- data.frame(x = 1:10,
y = rep(1:2, 5),
k = rnorm(10, 5,2),
z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
j = c(rep(c("a", "b", "c"), 3), "d"))

x <- c("y", "z")

for(i in 1:length(x)){
df[,x[i]] <- factor(df[,x[i]])}

そして数値に戻ります:

x <- 1:5

for(i in 1:length(x)){
df[,x[i]] <- as.numeric(as.character(df[,x[i]]))} # Character cannot become numeric

これを行うにはもっと良い方法があるのではないかと思いました。私はこの質問を見つけました。これはほぼ正確に私が必要としているものです。

convert.magic <- function(obj,types){
out <- lapply(1:length(obj),FUN = function(i){FUN1 <- 
switch(types[i],
character = as.character,
numeric = as.numeric,
factor = as.factor); FUN1(obj[,i])})
names(out) <- colnames(obj)
as.data.frame(out)
}

ただし、この関数の場合、各列にベクトルタイプを指定する必要があります。

convert.magic(df, rep("factor",5))

convert.magic(df, c("character", "factor"))
# Error in FUN(1:5[[1L]], ...) : could not find function "FUN1"

誰かが私を助けて、この関数を再構築して、列の名前と番号で機能するようにしてください。これは私にはあまりにも進んでいるのではないかと心配しています...

x <- c("y", "z")
convert.magic(df, "character", x)
4

1 に答える 1

6
df <- data.frame(x = 1:10,
                 y = rep(1:2, 5),
                 k = rnorm(10, 5,2),
                 z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
                 j = c(rep(c("a", "b", "c"), 3), "d"))

convert.magic <- function(obj, type){
  FUN1 <- switch(type,
                 character = as.character,
                 numeric = as.numeric,
                 factor = as.factor)
  out <- lapply(obj, FUN1)
  as.data.frame(out)
}

str(df)
str(convert.magic(df, "character"))
str(convert.magic(df, "factor"))
df[, c("x", "y")] <- convert.magic(df[, c("x", "y")], "factor")
于 2012-06-29T14:13:40.130 に答える