После некоторого поиска я не могу найти гладкое решение в стиле R-esque.
У меня есть список векторов, которые я хочу преобразовать в фреймы данных, и добавить столбец с именами векторов. Я не могу сделать это с помощью cbind () и melt () для одного кадра данных. B / c есть векторы с разным количеством строк.
Базовый пример:
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, которые многие базовые функции уже делают и намного эффективнее, чем я могу кодировать на этом этапе.
Мне нужен псевдокод:
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 () в этом контексте.
list
. - person coffeinjunky   schedule 06.05.2019