Это просто так, как работает R? ссылка на элемент списка, имена (список [x]), lapply + функции + запись таблицы
Есть ли способ напечатать в файл результат ddply и список dfs за один вызов lapply?
пример df
m<-rep(c("a1","a2","a3","b1","b2","b3","c1","c2","c3"),2)
n<-rep(c(rep(letters[1],3),rep(letters[2],3),rep(letters[3],3)),2)
o<-rep(c("2009","2010"),9)
p<-c(rep("width",9),rep("depth",9))
r<-c(sample((100:200),9),sample((20:50),9))
s<-data.frame(m,n,o,p,r)
colnames(s)<-c("event","site","year","metric","value")
s
u<-split(s,s$year)
Эта функция прекрасно работает в два этапа:
w<- lapply(u,function(x) {
v<-ddply(x,.(metric),
summarize, result_var_all=var(value))
})
sapply(names(w), function(x){ write.csv(w[x],file=paste(x,'.csv'))})
Но возможно ли объединить эти шаги, больше похоже на:
lapply(u,function(x) {
v<-ddply(x,.(metric),
summarize, result_var_all=var(value))
write.table(v,file=paste(names(u[x]),'.csv'))})
Который не работает. Я думаю, что понимаю, почему, если х это новый список. Подстановка имен (x[1]) для u[x] выполняется, но записывает имя первого поля в качестве заголовка файла и выглядит так, как будто он генерирует только один выходной файл вместо разделения выходных файлов по годам.
Является ли проблема смешивания DFS и списки, данные
names(u)
names(u[1])
У х нет имени?
1 ответ
Да, это путь R
работает.
Решение заключается в использовании Map
или же names()
(как вы сделали в части вашего вопроса)
карта
Map(names(u), u, f = function(xn,x) {
v <- ddply(x, .(metric),summarize, result_var_all=var(value))
write.csv(v, file = sprintf('%s.csv',xn))
v})
лапы + имена
lapply(names(u), FUN = function(xn,x) {
v <- ddply(x[[xn]], .(metric),summarize, result_var_all=var(value))
write.csv(v, file = sprintf('%s.csv',xn))
v}, x = u)