После поиска в течение некоторого времени я не могу найти гладкое решение R-esque.
У меня есть список векторов, которые я хочу преобразовать в кадры данных, и добавить столбец с именами векторов.Я не могу сделать это с помощью cbind () и melt () для одного кадра данных, потому что есть векторы с разным количеством строк.
Базовый пример:
list<-list(a=c(1,2,3),b=c(4,5,6,7))
var<-"group"
Что яЯ придумал и работает:
list<-lapply(list, function(x) data.frame(num=x,grp=""))
for (j in 1:length(list)){
list[[j]][,2]<-names(list[j])
names(list[[j]])[2]<-var
}
Но я пытаюсь лучше использовать lapply () и иметь более чистые методы кодирования.Прямо сейчас я так сильно полагаюсь на операторы for и if, которые многие базовые функции уже выполняют, и гораздо эффективнее, чем я могу кодировать на этом этапе.
Код psuedo, который я хотел бы, выглядит примерно так:
list<-lapply(list, function(x) data.frame(num=x,get(var)=names(x))
Есть ли чистый способ сделать это?
Второй тесно связанный вопрос, если у меня уже есть список фреймов данных, почему так сложно переназначить значения и имена столбцов, используяlapply ()?
Таким образом, используя что-то вроде:
list<-list(a=data.frame(num=c(1,2,3),grp=""),b=data.frame(num=c(4,5,6,7),grp=""))
var<-"group"
#pseudo code
list<-lapply(list, function(x) x[,2]<-names(x)) #populate second col with name of df[x]
list<-lapply(list, function(x) names[[x]][2]<-var) #set 2nd col name to 'var'
Первая строка псевдокода выдает ошибку о совпадении длин строк.Почему lapply () не просто зацикливается и повторяет имена (x), как та же функция на одном кадре данных в цикле for?
Для второй строки, насколько я понимаю, я могу использовать setNames ()переназначить все имена столбцов, но как мне заставить это работать только для одного из имен столбцов?
Большое спасибо за любые идеи или за указание на другие потоки, которые охватывают это, и помогая мне понять поведение lapply () в этом контексте.