[아르 자형] R-문자열에서 데이터 프레임 열 가져 오기 [중복]
당신은 변해야합니다
dfData$as.name(strColName) <- factor(dfData$get(strColName))
...에
dfData[[strColName]] <- factor(dfData[[strColName]])
?"[["
더 많은 것을 읽을 수 있습니다 .귀하의 경우 열 이름은 프로그래밍 방식으로 생성
[[]]
되며 유일한 방법입니다. 이 예제는 다음과 같은 문제를 설명하기에 충분히 명확 할 것입니다
$
.
dat <- data.frame(x = 1:5, y = 2:6)
z <- "x"
dat$z
# [1] NULL
dat[[z]]
# [1] 1 2 3 4 5
다른 답변에 대해
apply
적용하는 기능이
as.factor
또는 이므로 확실히 작동하지 않습니다
factor
.
apply
항상 행렬에서 작동하고
(데이터 프레임에 데이터 프레임을 제공하면 먼저 행렬로 변환) 행렬
을 반환하지만 행렬에 요인 데이터 클래스를 가질 수 없습니다. 이 예를 고려하십시오.
x <- data.frame(x1 = letters[1:4], x2 = LETTERS[1:4], x3 = 1:4, stringsAsFactors = FALSE)
x[, 1:2] <- apply(x[, 1:2], 2, as.factor)
str(x)
#'data.frame': 4 obs. of 3 variables:
# $ x1: chr "a" "b" "c" "d"
# $ x2: chr "A" "B" "C" "D"
# $ x3: int 1 2 3 4
요인이 아닌 문자 변수가 여전히 있습니다. 내가 말했듯이 우리는 다음을 사용해야합니다
lapply
.
x[1:2] <- lapply(x[1:2], as.factor)
str(x)
#'data.frame': 4 obs. of 3 variables:
# $ x1: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
# $ x2: Factor w/ 4 levels "A","B","C","D": 1 2 3 4
# $ x3: int 1 2 3 4
이제
x1
및 에서 요인 분류를 볼 수
x2
있습니다.
apply
데이터 프레임에 사용 하는 것은 결코 좋은 생각이 아닙니다.
소스 코드를 읽으면
apply
:
dl <- length(dim(X))
if (is.object(X))
X <- if (dl == 2L)
as.matrix(X)
else as.array(X)
데이터 프레임 (2 차원)이 먼저 행렬로 강제 변환되는 것을 볼 수 있습니다. 이것은 매우 느립니다. 데이터 프레임 열에 여러 개의 다른 클래스가있는 경우 결과 행렬에는 하나의 클래스 만 있습니다. 그러한 강압의 결과가 어떻게 될지 누가 알겠습니까?그러나
apply
일반
for
루프를 사용하여 C가 아닌 R로 작성되었습니다 .
for (i in 1L:d2) {
tmp <- forceAndCall(1, FUN, newX[, i], ...)
if (!is.null(tmp))
ans[[i]] <- tmp
따라서
for
직접 작성 하는 명시 적 루프 보다 낫지 않습니다 .-------------------
다른 방법을 사용합니다. 요인으로 변경할 열 이름의 벡터를 만듭니다.
factorCols <- c("Admit", "Rank")
그런 다음 인덱스로 다음 열을 추출합니다.
myCols <- which(names(dfData) %in% factorCols)
마지막으로 apply를 사용하여 이러한 열을 요인으로 변경합니다.
dfData[,myCols] <- lapply(dfData[,myCols],as.factor)
출처
https://stackoverflow.com/questions/39940021