用R替换data.tables列表中的列

时间:2014-02-06 14:55:38

标签: r data.table lapply

如何替换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 替换纠正的enconding,基本上用编码的名称替换列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列表中的列?

1 个答案:

答案 0 :(得分: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

请注意,这会修改原始数据。