2015-03-03 5 views
2

Я хочу обновить несколько столбцов в большой таблице с данными обследований домашних хозяйств. Около 20 столбцов имеют расходы, указанные как отрицательные. Тем не менее, я хочу иметь абсолютные значения (для изготовления латексной таблицы). Мне удалось создать новую таблицу данных только с этими обновленными столбцами. Вот пример. Я только хочу, чтобы обновить столбцы 2 и 3:Обновление нескольких столбцов в data.table

library(data.table) 
test <- data.table(c(1,2,3,4),c(-2,-3,-4,-5),c(-1,-4,-5,-6),c(1,2,3,6)) 
test[,lapply(.SD,abs),.SDcols=2:3] 

Это дает мне data.table с графами 2 и 3, а не полным data.table.

я могу легко сделать это делает data.frames и использование cbind:

df1.test<-data.frame(test)[,-c(2:3)] 
df2.test<-data.frame(test[,lapply(.SD,abs),.SDcols=2:3]) 
test<-data.table(cbind(df1.test,df2.test)) 

, но, возможно, есть более разумный способ в data.table.

Благодаря Ренгер

+0

Вы можете использовать библиотеку dplyr package 'library (dplyr); test <- test %>% mutate (V2 = abs (V2), V3 = abs (V3)) ' –

+1

Вы знакомы с оператором': = '? –

ответ

4

Вы можете попробовать

test[,2:3 := lapply(.SD,abs),.SDcols=2:3][] 

Или быстрее подход будет использовать set (как это было предложено @Frank), поскольку он обеспечивает прямое задание по ссылке с низкими накладными расходами

for(j in 2:3){ 
    set(test, i=NULL, j=j, value=abs(test[[j]])) 
} 
Смежные вопросы