Создайте имена для списка фреймов данных на основе значения в этом фрейме данных - PullRequest
2 голосов
/ 02 мая 2019

Я пытаюсь использовать уникальное значение в столбце для именования другого столбца в списке фреймов данных

library(data.table)

a <- c("BZ", "BZ", "BZ", "US", "US", "US")
b <- c(1, 3, 5, 2, 4, 6)
c <- data.table(a, b)
d <- split(c, c$a)

Я хочу затем удалить столбец A и использовать уникальное значение из столбца a вимя столбца B

Например, если бы у меня был только один кадр данных с одним значением, я мог бы сделать это:

c <- subset(c, a == "BZ")
x <- unique(c$a)
setnames(c, "b", x)

Есть ли способ выполнить это в списке фреймов данных

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Мы можем использовать lapply для циклического перебора list из data.table s, извлечения первого элемента 'a' (поскольку существует только один элемент unique и установка имен столбцов с помощью setnames

library(data.table)
d1 <- lapply(d, function(x) setnames(x[, .(b)], x$a[1]))

Или мы могли бы использовать подмножество столбцов до split

d2 <- split(c[, .(b)], c$a)
Map(setnames, d2, names(d2))

Если мы не хотим отбрасывать столбец

lapply(d,  function(x) setnames(x, "b", x$a[1]))

Или используйте Map

Map(setnames, d, old = "b", new = names(d))
0 голосов
/ 02 мая 2019

Возможно, это не самое элегантное решение, но я думаю, что оно выполняет то, что вы ищете:

a <- c("BZ", "BZ", "BZ", "US", "US", "US")
b <- c(1, 3, 5, 2, 4, 6)
c <- data.table(a, b)
d <- split(c, c$a)

e <- lapply(d, function(x) {
  names(x)[grepl('b', names(x))] <- unique(x$a)
  x
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...