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

0

У меня есть список фреймов данных

# Create dummy data
df1<-data.frame( c(1,2,3),c(2,3,4))
df2<-data.frame(c(5,6,7),c(4,5,6))

# Create a list
l<-list(df1, df2)

Я хочу присвоить столбцам имена. В видеl[[1]][,1] дает мне доступ к первому столбцу, я думал, что могу назначить 'names' в качестве имени первого столбца:

l<-lapply(l, function(x)names(x[[1]][,1]<-"names"))

Но это дает мне ошибку

Error in x[[1]][, 1] <- "names" : 
  incorrect number of subscripts on matrix

Изменить: добавлены некоторые исходные данные dput

dput(lapply(head(results1, 2), head, 2))
list(structure(c(1.27679607834331, 1.05090175857491), .Dim = 2:1, .Dimnames = list(
    c("..a15.pdf", "..a17.pdf"), "x")), structure(c(2.096687569578, 
2.19826038300833), .Dim = 2:1, .Dimnames = list(c("..a15.pdf", 
"..a17.pdf"), "x")))

после попытки присвоить имя

dput(lapply(head(results1, 2), head, 2))
list(structure(c(1.27679607834331, 1.05090175857491), .Dim = 2:1, .Dimnames = list(
    c("..a15.pdf", "..a17.pdf"), "names")), structure(c(2.096687569578, 
2.19826038300833), .Dim = 2:1, .Dimnames = list(c("..a15.pdf", 
"..a17.pdf"), "names")))

Выход:

results1[1]
[[1]]
                       names
..a15.pdf         1.27679608
..a17.pdf         1.05090176
..a18.pdf         1.51820192
..a21.pdf         2.30296037
..a2TTT.pdf       1.48568732
Теги:
CodeFix

1 ответ

2
Лучший ответ

Вы можете подмножествоnames фрейма данных:

l <- lapply(l, function(x) {names(x)[1] <-"names";x})
l

Вtidyverse -

library(dplyr)
library(purrr)

l <- map(l, ~.x %>% rename_with(~'names', 1))

Из обновленных данных кажется, что у вас есть список матриц, и первый столбец на самом деле имеет имя rowname, которое вы можете преобразовать в столбец и назвать его.

lapply(results1, function(x) {
  mat <- cbind.data.frame(names = rownames(x), x)
  rownames(mat) <- NULL
  mat
})

#[[1]]
#      names    x
#1 ..a15.pdf 1.28
#2 ..a17.pdf 1.05

#[[2]]
#      names   x
#1 ..a15.pdf 2.1
#2 ..a17.pdf 2.2
Поделиться
Источник
  • 0
    спасибо, он работает на приведенном мной примере, поэтому я принял ответ. Но когда я пробую свой исходный список, кажется, что 'names' назначается в качестве атрибута первой переменной в первом столбце (у меня 22 переменных), поэтому, когда я пытаюсь l [[1]], он дает мне два столбца без имени для первого столбца, а затем следующий текст: attr (, "names") [1] "names" NA NA NA NA NA NA NA NA ........... [19] NA NA NA NA. Если у вас есть идея, почему это происходит, было бы здорово, иначе я попробую разобраться сам.
  • 0
    Это означает, что ваши фактические данные имеют другую структуру. Не могли бы вы предоставить дополнительную информацию о данных? Что возвращают lengths(l) и class(l[[1]])
  • 0
    ваши вторые предложения дают мне эту ошибку в моем списке Ошибка в UseMethod ("rename_with"): нет применимого метода для 'rename_with', применяемого к объекту класса "c ('matrix', 'array', 'double', 'numeric' ) "
  • 1
    Думаю, это может сработать. Попробуйте l <- lapply(l, function(x) {colnames(x)[1] <-"names";x})
  • 0
    длина (результаты1) [1] 462> класс (результаты1 [[1]]) [1] "матрица" "массив"
  • 0
    ваше второе предложение дает мне тот же результат, что и первое. Я имею в виду предложение, которое вы разместили в комментариях. Думаю, я отправлю еще один вопрос с выводом моих данных.
  • 0
    Значит, l <- lapply(l, function(x) {colnames(x)[1] <-"names";x}) тоже не работает? Это странно. Можете ли вы отредактировать свой пост с актуальными данными? Скопируйте вывод dput(lapply(head(l, 2), head, 2))
  • 0
    Добавлен dput из исходных данных и в результате применения функции
  • 0
    Я уже вижу имя 1-го столбца как names в dput . Разве это не то, что вы ищете?
  • 0
    значит, моя первая колонка не колонка? Я вижу имена, но думаю, это вторая колонка. Я добавлю то, что вижу в своем вопросе.
  • 0
    Это не столбец, это первые имена матрицы. Что ты хочешь с ними делать? Вы хотите оставить его в качестве первого столбца или удалить?
  • 0
    Я хочу, чтобы это была первая колонка. Я думал, что сделал это по results1 <-lapply (results1, function (x) cbind (x, names = rownames (x)))
  • 1
    Я обновил ответ, который вы можете использовать на исходных данных. Это создаст rownames как новый столбец, преобразует матрицу в dataframe и удалит rownames. Матрица может содержать данные только одного типа, поэтому, если вы создадите новый столбец с именами, он также изменит числа на символы, поэтому я изменил это на фрейм данных.
  • 0
    Я пробовал. К сожалению, это дает ошибку Ошибка в data.frame (..., check.names = FALSE): аргументы подразумевают разное количество строк: 0, 22.
  • 0
    Хммм .... Невозможно воспроизвести это на данных, которыми вы поделились.

Другие вопросы

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум