Это просто так, как работает 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)
Другие вопросы по тегам