2014-02-06 115 views
1

如何替換data.tables列表中的列?用R替換data.tables列表中的列

這裏是約。數據我有:

data1 <- data.table(V1=c("Mžn","Tue","Wžd","Thř","Fr"),a2012=rnorm(5),a2011=rexp(5,2)) 
data2 <- data.table(V1=c("Mžn","Tue","Wžd","Thř","Fr"),a2012=rnorm(5),a2011=rexp(5,2),a2010=rbinom(5,2,0.3)) 
ListData <- list(data1,data2) 

這是怎麼回事。基本上我需要擺脫UTF-8 enconding的:

list.ch <- lapply(ListData, "[",,"V1") 

下面是一些NA來了,但它在原始數據的工作。所以不要記:

TranslList <- lapply(list.ch, function(x) try(iconv(x, "UTF-8", "ASCII//TRANSLIT"))) 

所以我想,以取代更正了上面的原始ListData,基本上用編碼名稱替換列V1。

matList <- lapply(ListData,as.matrix) 
testMat <- lapply(lapply(matList, function(x) x[,-c(1)]),data.table) 

FrameList <- mapply(cbind, TranslList, testMat) 

在這混亂和不必要的操作的問題是,從V1列名更改爲一些即點[1L]] [[2L]

總之,如何在列表更換色譜柱data.tables?

回答

4

看起來你正在爲自己拼命。一個簡單的lapply()會做:

library(data.table) 

wday <- c("Mžn","Tue","Wžd","Thř","Fr") 
data1 <- data.table(V1 = wday, a2012 = rnorm(5), a2011 = rexp(5,2)) 
data2 <- data.table(V1 = wday, a2012 = rnorm(5), a2011 = rexp(5,2), 
    a2010 = rbinom(5,2,0.3)) 
data <- list(data1, data2) 

translit <- function(x) iconv(x, "UTF-8", "ASCII//TRANSLIT", sub = "byte") 

invisible(lapply(data, function(dt) { 
    dt[, V1 := translit(V1)] 
})) 
data 

注意,這就地修改的原始數據。

+1

我不認爲你需要函數中的最後'dt',它可能只是'lapply(data,function(dt)dt [,V1:= translit(V1)])' – nograpes

+0

澄清它正在修改到位。 – hadley

+0

data.table讓我的大腦流口水。它是如此美麗而強大<3 – Stefano