2017-05-19 5 views
2

data.table의 열 이름을 내 수식의 입력으로 사용하고 싶습니다. 그러나 행의 이름을 직접 삽입 할 때마다 항상 작동합니다. 개체에서 이름을로드하면 작동하지 않습니다. 나는 그것이 내가이 이름은 [1] 나에게 대신 VAR1의 "VAR1"를 제공한다는 사실과 관련이 생각data.table의 공식에 열 이름을 사용하십시오.

library(data.table) 
    dt <- data.table(ID= c(1,2,3,4,5,6,7,8,9), 
        var1 = c(100,150,200,180,10,15,11,25,1), 
        var2 = c(150,200,250,300,15,20,19,30,2), 
        var3 = c(100,101,102,103,104,105,106,107,109)) 

# Insert column name direvtly in Formular seems to work 
    dt[, var1 := (var1 - mean(var1, na.rm = TRUE)/sd(var1, na.rm = TRUE)) ] 

# Load name from formular does not work 
    Names <- c("var1", "var2", "var3") 
    for (i in 1:3){ 
    dt[, Names[i] := (Names[i] - mean(Names[i], na.rm = TRUE)/sd(Names[i], na.rm = TRUE)) ]} 

사실에 관한 생각합니다. 나는 포럼에서 비슷한 문제를 찾고 있었고 as.symbol(), as.name()과 같은 명령이 있지만 도움이되지 않는 것으로 나타났습니다.

답변

2

하나의 옵션은 객체

for (i in 1:3){ 
    dt[, (Names[i]) := (get(Names[i]) - mean(get(Names[i]), 
     na.rm = TRUE)/sd(get(Names[i]), na.rm = TRUE)) ] 
} 

의 값을 얻을 수 get를 사용하거나 다른 옵션은 set

for(j in Names){ 
    set(dt, i = NULL, j = j, value = (dt[[j]] - mean(dt[[j]], 
        na.rm = TRUE)/sd(dt[[j]], na.rm = TRUE))) 
    } 
dt 
# ID   var1  var2  var3 
#1: 1 99.05324836 149.060863 64.52132 
#2: 2 149.05324836 199.060863 65.52132 
#3: 3 199.05324836 249.060863 66.52132 
#4: 4 179.05324836 299.060863 67.52132 
#5: 5 9.05324836 14.060863 68.52132 
#6: 6 14.05324836 19.060863 69.52132 
#7: 7 10.05324836 18.060863 70.52132 
#8: 8 24.05324836 29.060863 71.52132 
#9: 9 0.05324836 1.060863 73.52132 

또는 통해 Names.SDcols에서 루프를 지정 Data.table의 서브 세트, 계산하기 과에 Names

dt[, (Names) := lapply(.SD, function(x) x- mean(x, na.rm = TRUE)/sd(x, 
         na.rm = TRUE)), .SDcols = Names] 
+1

당신에게 정말 고마워요 다시 열 출력을 (;=)를 할당합니다. 나는이 명령에 의해 농담을 얻고 있었지만 당신의 해결책은 잘 작동합니다. – JohnnyKing