R: работать со списком и сохранять вывод в новом списке - PullRequest
1 голос
/ 30 сентября 2019

У меня есть список фреймов данных, я хотел бы работать со списком и сохранять выходные данные в новом фрейме данных. в частности, я хочу сохранить путь и столбец месяца, в то время как сделать первую строку столбца данных 1, а остальные строки в результате деления между строкой k и k-1.

Пример данных

myList2 <- list()
myList2[[1]]<- as.data.frame(matrix(c(1,1,1,1,2,3,5,6,7), nrow=3, ncol=3))
myList2[[2]]<- as.data.frame(matrix(c(2,2,2,1,2,3,4,6,5), nrow=3, ncol=3))
myList2[[3]]<- as.data.frame(matrix(c(3,3,3,1,2,3,6,7,6), nrow=3, ncol=3))
colnames <- c("path","month", "data")
myList2<-lapply(myList2, setNames,colnames)
print(myList2)
> print(myList2)
[[1]]
  path month data
1    1     1    5
2    1     2    6
3    1     3    7

[[2]]
  path month data
1    2     1    4
2    2     2    6
3    2     3    5

[[3]]
  path month data
1    3     1    6
2    3     2    7
3    3     3    6

Что я пробовал до сих пор:

x <- list()
x <- for (i in 1:length(myList2))
{
for (k in 2:length(myList2[i]))
{
x[[i]][1] <- 1
x[[i]][k] <- myList2[[i]][k]/myList2[[i]][k-1]
}
}

Желаемый результат:

myList <- list()
myList[[1]]<- as.data.frame(matrix(c(1,1,1,1,2,3,1,5/6,6/7), nrow=3, ncol=3))
myList[[2]]<- as.data.frame(matrix(c(2,2,2,1,2,3,1,4/6,5/6), nrow=3, ncol=3))
myList[[3]]<- as.data.frame(matrix(c(3,3,3,1,2,3,1,6/7,7/6), nrow=3, ncol=3))
colnames <- c("path","month", "data")
myList<-lapply(myList, setNames,colnames)
print(myList)
> print(myList)
[[1]]
  path month      data
1    1     1 1.0000000
2    1     2 0.8333333
3    1     3 0.8571429

[[2]]
  path month      data
1    2     1 1.0000000
2    2     2 0.6666667
3    2     3 0.8333333

[[3]]
  path month      data
1    3     1 1.0000000
2    3     2 0.8571429
3    3     3 1.1666667

1 Ответ

2 голосов
/ 30 сентября 2019

Мы можем перебрать list с map и mutate 'данными', разделив столбец с lead столбца, и перенастроить вывод путем объединения 1 в начале

library(purrr)
library(dplyr)
map(myList2, ~ .x %>%
                   mutate(data = c(1, na.omit(data/lead(data)))))

или с base R с использованием той же логики

lapply(myList2, transform, data = c(1, data[-length(data)]/data[-1]))
#[[1]]
#  path month      data
#1    1     1 1.0000000
#2    1     2 0.8333333
#3    1     3 0.8571429

#[[2]]
#  path month      data
#1    2     1 1.0000000
#2    2     2 0.6666667
#3    2     3 1.2000000

#[[3]]
#  path month      data
#1    3     1 1.0000000
#2    3     2 0.8571429
#3    3     3 1.1666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...