2012-06-29 3 views
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) 
} 

그러나,이 기능 벡터 유형은 각 열에 대해 지정해야합니다 위해 : 나는 내가 필요로하는 거의 정확하게 무엇 인 this question을 발견

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

convert.magic(df, c("character", "factor")) 
# Error in FUN(1:5[[1L]], ...) : could not find function "FUN1" 
누군가가 나를 도울 때문에이 기능을 다시 할 수

열 이름과 숫자로 작동하는지 확인하십시오. ? "약 원래 숫자에 f를 요인을 변환하려면 : 당신은 단지 factor``에서 숫자로 요소를 변환하는 경우 나는

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

...이 나를 위해 너무 고급이 될 것이라고 두려워 as.numeric (레벨 (f)) [f]가 as.numeric (as.character (f))보다 약간 더 효율적이고 권장됩니다. " 이는 또한'convert.magic'이 특정 상황에서 예기치 않은 결과를 가져올 수도 있음을 나타냅니다. – BenBarnes

+0

@BenBarnes 흠 ... 나는 그걸 몰랐다. 아주 좋은 코멘트, 감사합니다! – Mikko

답변

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") 
+3

전체 data.frame을 변환합니다. 약간의 수정은 내가 무엇을했는지에 더 가깝다 : 'convert.magic <- function (obj, type, cols) { FUN1 <- switch (type, 문자 = as.character, 숫자 = as.numeric, factor =>. as_factor) obj [, cols] <- lapply (obj [, cols], FUN1) as.data.frame (obj) }'어떻게 BenBarnes 주석 ('as.numeric (levels (f)) [f]')이 함수에서? – Mikko

+1

@Largh'switch' 문에서'as.numeric'을 사용하는 대신 입력이 요소인지 아닌지를 검사하는 간단한 래퍼를 작성할 것입니다. 그렇다면 Ben의 메소드를 사용하고, 그렇지 않으면'as.numeric'을 사용하십시오. – joran

관련 문제