2013-04-25 3 views
6

벡터화 된 작업을 사용하여 데이터 테이블에서 선택한 변수의 클래스를 변경하고 싶습니다. 나는 data.table 문법을 처음 사용하고 가능한 한 많이 배우려고 노력하고있다. 나는 이제 기본적인 질문이지만 데이터 표의 사고 방식을 더 잘 이해하는 데 도움이 될 것입니다!데이터 테이블의 선택 열을 다시 분류

비슷한 질문이 있습니다. here! 그러나이 솔루션은 단 하나의 열 또는 모든 열을 재 분류하는 것과 관련이있는 것으로 보입니다. 내 질문은 일부 소수의 열에는 고유합니다.

### Load package 
require(data.table) 

### Create pseudo data 
data <- data.table(id  = 1:10, 
        height = rnorm(10, mean = 182, sd = 20), 
        weight = rnorm(10, mean = 160, sd = 10), 
        color = rep(c('blue', 'gold'), times = 5)) 

### Reclass all columns 
data <- data[, lapply(.SD, as.character)] 

### Search for columns to be reclassed 
index <- grep('(id)|(height)|(weight)', names(data)) 

### data frame method 
df <- data.frame(data) 
df[, index] <- lapply(df[, index], as.numeric) 

### Failed attempt to reclass columns used the data.table method 
data <- data[, lapply(index, as.character), with = F] 

어떤 도움을 주시면 감사하겠습니다. 내 데이터가 크기 때문에 정규 표현식을 사용하여 재 분류 할 열 번호 벡터를 만드는 것이 필요합니다.

감사합니다.

답변

8

나는 @ SimonO101이 작업의 대부분은

data[, names(data)[index] := lapply(.SD, as.character) , .SDcols = index ] 

당신은 그냥 사용할 수 않았다고 생각 := 당신은 set를 사용하여 j.SD의 건설의 오버 헤드를 피할 수

+0

+1 그게 다야 !! 좋아, 내 대답이 잘못 되었기 때문에 나는 그것을 지울거야. –

+0

아니, 내가 그 트릭 ('.SDCols')을 배웠다. – dickoa

+2

(+1) 당신은 직접'index'도 전달할 수있다. – Arun

4

당신은 (내가 오늘 배운!) 색인 벡터를 .SDcols를 사용해야하지만 단지 reclassed 열이있는 데이터 테이블을 반환합니다. @ 디코아의 대답은 당신이 찾고있는 것입니다.

data <- data[, lapply(.SD, as.character) , .SDcols = index ] 
sapply(data , class) 
     id  height  weight 
"character" "character" "character" 
+0

이렇게하면 "인덱스"열만있는 새로운 데이터 테이블 어떻게 "인덱스"열의 클래스를 변경하고 나머지 데이터 테이블을 그대로 유지할 수 있습니까? 병합 또는 cbind를 사용하여이 작업을 수행하는 방법을 쉽게 볼 수 있지만보다 우아한 방법이 있어야합니다! – Andreas

+0

Argggh. 당신 말이 맞아요. 나도 알아,하지만 구문에 문제가있다. 쉬운 구문이 있습니다 - 올바른 구문을 기억하려고합니다 !! –

+0

주목해야 할 중요한 사항입니다. 우리가 배운 것을 반영하도록 응답을 편집 해 주셔서 감사합니다! – Andreas

9

마법

for(j in index) set(data, j =j ,value = as.character(data[[j]])) 
+2

(+1) 이것은 2 개의 계정에서 빠르고 효율적입니다 : 1) .SD가없고 2)': ='대신'set'을 사용합니다 (후자는'[.data.table' 오버 헤드가 있습니다). 훌륭한! – Arun

+2

@Arun, data.frames에서도 작동합니다! – mnel

관련 문제