많은 수의 열을 요인에서 숫자로 변경하는 가장 빠르고 / 좋은 방법은 무엇입니까?
다음 코드를 사용했지만 내 데이터를 다시 정렬 한 것 같습니다.
> head(stats[,1:2])
rk team
1 1 Washington Capitals*
2 2 San Jose Sharks*
3 3 Chicago Blackhawks*
4 4 Phoenix Coyotes*
5 5 New Jersey Devils*
6 6 Vancouver Canucks*
for(i in c(1,3:ncol(stats))) {
stats[,i] <- as.numeric(stats[,i])
}
> head(stats[,1:2])
rk team
1 2 Washington Capitals*
2 13 San Jose Sharks*
3 24 Chicago Blackhawks*
4 26 Phoenix Coyotes*
5 27 New Jersey Devils*
6 28 Vancouver Canucks*
다음과 같이 모든 열의 이름을 지정하지 않는 가장 좋은 방법은 무엇입니까?
df$colname <- as.numeric(ds$colname)
답변
Ramnath의 대답에 더하여, 경험하는 행동 은 R 수준에서 as.numeric(x)
요인의 내부 숫자 표현 을 반환하기 때문 x
입니다. (내부 표현이 아닌) 요인의 수준 인 숫자를 보존하려면 as.character()
Ramnath의 예에 따라 먼저 문자를 통해 변환해야합니다 .
귀하의 for
루프는 단지 합리적인 같다 apply
호출하고 코드의 의도가 무엇인지에 관해서는 약간 더 읽을 수 있습니다. 이 줄을 변경하십시오.
stats[,i] <- as.numeric(stats[,i])
읽다
stats[,i] <- as.numeric(as.character(stats[,i]))
이다 질문 7.10 는 R 자주 묻는 질문한다.
HTH
답변
요인을 숫자로 변경할 때는주의해야합니다. 다음은 요소에서 숫자로 열 집합을 변경하는 코드 줄입니다. 여기서는 숫자로 변경할 열이 각각 1, 3, 4 및 5라고 가정합니다. 그에 따라 변경할 수 있습니다.
cols = c(1, 3, 4, 5);
df[,cols] = apply(df[,cols], 2, function(x) as.numeric(as.character(x)));
답변
이 작업은 한 줄로 수행 할 수 있으며 for 루프 든 적용이든 루프가 필요하지 않습니다. 대신 unlist () 사용 :
# testdata
Df <- data.frame(
x = as.factor(sample(1:5,30,r=TRUE)),
y = as.factor(sample(1:5,30,r=TRUE)),
z = as.factor(sample(1:5,30,r=TRUE)),
w = as.factor(sample(1:5,30,r=TRUE))
)
##
Df[,c("y","w")] <- as.numeric(as.character(unlist(Df[,c("y","w")])))
str(Df)
편집 : 코드의 경우 다음과 같습니다.
id <- c(1,3:ncol(stats)))
stats[,id] <- as.numeric(as.character(unlist(stats[,id])))
당연히 1 열 데이터 프레임이 있고 R의 자동 차원 축소를 벡터로 변환하지 않으려면 drop=FALSE
인수 를 추가해야합니다 .
답변
나는이 질문이 오랫동안 해결되었음을 알고 있지만 최근 비슷한 문제가 있었고 magrittr 패키지가 필요하지만 조금 더 우아하고 기능적인 솔루션을 찾은 것 같습니다.
library(magrittr)
cols = c(1, 3, 4, 5)
df[,cols] %<>% lapply(function(x) as.numeric(as.character(x)))
그만큼 %<>%
조작 파이프 및 유지 데이터 세정하고 간단한 변환 매우 유용 다시 할당. 이제 적용하려는 기능 만 지정하면 목록 적용 기능을 훨씬 쉽게 읽을 수 있습니다.
답변
다음은 몇 가지 dplyr
옵션입니다.
# by column type:
df %>%
mutate_if(is.factor, ~as.numeric(as.character(.)))
# by specific columns:
df %>%
mutate_at(vars(x, y, z), ~as.numeric(as.character(.)))
# all columns:
df %>%
mutate_all(~as.numeric(as.character(.)))
답변
ucfagls가 이유 를 찾았다 고 생각합니다 가 루프가 작동하지 않는 .
여전히 루프를 사용하고 싶지 않은 경우 다음과 lapply
같은 솔루션이 있습니다 .
factorToNumeric <- function(f) as.numeric(levels(f))[as.integer(f)]
cols <- c(1, 3:ncol(stats))
stats[cols] <- lapply(stats[cols], factorToNumeric)
편집하다. 더 간단한 해결책을 찾았습니다. as.matrix
캐릭터로 변신하는 것 같습니다 . 그래서
stats[cols] <- as.numeric(as.matrix(stats[cols]))
당신이 원하는 것을해야합니다.
답변
lapply는 이것을 위해 거의 설계되었습니다.
unfactorize<-c("colA","colB")
df[,unfactorize]<-lapply(unfactorize, function(x) as.numeric(as.character(df[,x])))