Как удалить наблюдения из нескольких фреймов данных и сохранить их в виде нескольких фреймов данных - PullRequest
0 голосов
/ 20 сентября 2019

У меня много фреймов данных - вот упрощенная версия двух из них.

flows <- structure(list(Student = c("Adam", "Char", "Fred", "Greg", "Ed", "Mick", "Dave", "Nick", "Tim", "George", "Tom"), 
                 Class = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), Jan_18_score = c(NA, 5L, -7L, 2L, 1L, NA, 5L, 8L, -2L, 5L, NA), 
                 Feb_18_score = c(2L,   0, 8L, NA, 2L, 6L, NA, 8L, 7L, 3L, 8L), Jan_18_Weight = c(150L, 30L, NA, 80L, 60L, 80L, 40L, 12L, 23L, 65L, 78L), 
                 Feb_18_Weight = c(153L, 60L, 80L, 40L, 80L, 30L, 25L, 45L, 40L, NA, 50L)), class = "data.frame", row.names = c(NA, -11L))


returns <- structure(list(Student = c("Adam", "Char", "Fred", "Greg", "Ed", "Mick", "Dave", "Nick", "Tim", "George", "Tom"), 
                  Class = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), Jan_20_score = c(NA, 5L, -7L, 2L, 1L, NA, 5L, 8L, -2L, 5L, NA), 
                  Feb_20_score = c(2L,   0, 8L, NA, 2L, 6L, NA, 8L, 7L, 3L, 8L), Jan_20_Weight = c(150L, 30L, NA, 80L, 60L, 80L, 40L, 12L, 23L, 65L, 78L), 
                  Feb_20_Weight = c(153L, 60L, 80L, 40L, 80L, 30L, 25L, 45L, 40L, NA, 50L)), class = "data.frame", row.names = c(NA, -11L))

Я использую lapply для удаления некоторых наблюдений, я хотел бы сделать это для всех моих фреймов данных и сохранить выходные данные в виде фреймов данных, в основном обновить существующие фреймы данных и удалить выбранные наблюдения.

Вот мой текущий код.

 df.list <- list(flows, returns)

lapply(df.list, function(df) df[!grepl("1", df$Class),])

Однако, когда я делаю это, выходные данные не обновляют исходные кадры данных и выводятся в виде списка в глобальной среде.Любая помощь приветствуется.

Ответы [ 2 ]

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

Другое решение:

flows <- structure(list(Student = c("Adam", "Char", "Fred", "Greg", "Ed", "Mick", "Dave", "Nick", "Tim", "George", "Tom"), 
                 Class = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), Jan_18_score = c(NA, 5L, -7L, 2L, 1L, NA, 5L, 8L, -2L, 5L, NA), 
                 Feb_18_score = c(2L,   0, 8L, NA, 2L, 6L, NA, 8L, 7L, 3L, 8L), Jan_18_Weight = c(150L, 30L, NA, 80L, 60L, 80L, 40L, 12L, 23L, 65L, 78L), 
                 Feb_18_Weight = c(153L, 60L, 80L, 40L, 80L, 30L, 25L, 45L, 40L, NA, 50L)), class = "data.frame", row.names = c(NA, -11L))

returns <- structure(list(Student = c("Adam", "Char", "Fred", "Greg", "Ed", "Mick", "Dave", "Nick", "Tim", "George", "Tom"), 
                  Class = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), Jan_20_score = c(NA, 5L, -7L, 2L, 1L, NA, 5L, 8L, -2L, 5L, NA), 
                  Feb_20_score = c(2L,   0, 8L, NA, 2L, 6L, NA, 8L, 7L, 3L, 8L), Jan_20_Weight = c(150L, 30L, NA, 80L, 60L, 80L, 40L, 12L, 23L, 65L, 78L), 
                  Feb_20_Weight = c(153L, 60L, 80L, 40L, 80L, 30L, 25L, 45L, 40L, NA, 50L)), class = "data.frame", row.names = c(NA, -11L))

 df.list <- list(flows, returns)

Теперь нам нужно присвоить lapply некоторому значению и присвоить ему имя:

a <- lapply(df.list, function(df) df[!grepl("1", df$Class),])
names(a) <- c("flows","returns")

После этого мы вызываем функцию list2env:

list2env(a, envir = .GlobalEnv)

Выход:

> flows
   Student Class Jan_18_score Feb_18_score Jan_18_Weight Feb_18_Weight
5       Ed     2            1            2            60            80
6     Mick     2           NA            6            80            30
7     Dave     3            5           NA            40            25
8     Nick     3            8            8            12            45
9      Tim     3           -2            7            23            40
10  George     3            5            3            65            NA
11     Tom     3           NA            8            78            50

> returns
   Student Class Jan_20_score Feb_20_score Jan_20_Weight Feb_20_Weight
5       Ed     2            1            2            60            80
6     Mick     2           NA            6            80            30
7     Dave     3            5           NA            40            25
8     Nick     3            8            8            12            45
9      Tim     3           -2            7            23            40
10  George     3            5            3            65            NA
11     Tom     3           NA            8            78            50

Проверка классов выходов:

> class(returns)
[1] "data.frame"

> class(flows)
[1] "data.frame"
1 голос
/ 20 сентября 2019

Я не уверен насчет использования lapply, но вы можете работать со списками переменных по имени, используя get и assign.

flows <- structure(list(Student = c("Adam", "Char", "Fred", "Greg", "Ed", "Mick", "Dave", "Nick", "Tim", "George", "Tom"), 
                        Class = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), Jan_18_score = c(NA, 5L, -7L, 2L, 1L, NA, 5L, 8L, -2L, 5L, NA), 
                        Feb_18_score = c(2L,   0, 8L, NA, 2L, 6L, NA, 8L, 7L, 3L, 8L), Jan_18_Weight = c(150L, 30L, NA, 80L, 60L, 80L, 40L, 12L, 23L, 65L, 78L), 
                        Feb_18_Weight = c(153L, 60L, 80L, 40L, 80L, 30L, 25L, 45L, 40L, NA, 50L)), class = "data.frame", row.names = c(NA, -11L))


returns <- structure(list(Student = c("Adam", "Char", "Fred", "Greg", "Ed", "Mick", "Dave", "Nick", "Tim", "George", "Tom"), 
                          Class = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), Jan_20_score = c(NA, 5L, -7L, 2L, 1L, NA, 5L, 8L, -2L, 5L, NA), 
                          Feb_20_score = c(2L,   0, 8L, NA, 2L, 6L, NA, 8L, 7L, 3L, 8L), Jan_20_Weight = c(150L, 30L, NA, 80L, 60L, 80L, 40L, 12L, 23L, 65L, 78L), 
                          Feb_20_Weight = c(153L, 60L, 80L, 40L, 80L, 30L, 25L, 45L, 40L, NA, 50L)), class = "data.frame", row.names = c(NA, -11L))

df.list <- list("flows", "returns")

for (df.name in df.list){
    temp <- get(df.name)
    temp <- temp[!grepl("1", temp$Class), ]
    assign(paste0(df.name, "_new"), temp)
}

Удалите «_new», чтобы перезаписать исходные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...