Замените столбец в списке 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:

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?


person Maximilian    schedule 06.02.2014    source источник


Ответы (1)


Похоже, вы усложняете себе жизнь. Подойдет простой 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

Обратите внимание, что это изменяет исходные данные на месте.

person hadley    schedule 06.02.2014
comment
Я не думаю, что вам нужен последний dt в функции, это может быть просто lapply(data,function(dt) dt[,V1:=translit(V1)]) - person nograpes; 06.02.2014
comment
Уточнил, что модифицируется на месте. - person hadley; 06.02.2014
comment
data.table заставляет мой мозг пускать слюни. Это так красиво и в то же время мощно ‹3 - person Stefano; 23.02.2018