Mam listę ramek danych i chciałbym zastąpić 0 w drugiej kolumnie wszystkich ramek danych na tej liście. Oto minimalny przykład działania listy ramek danych: > named

1
Wei 26 czerwiec 2021, 15:08

4 odpowiedzi

Najlepsza odpowiedź

Możesz użyć lapply -

listed <- lapply(listed, function(x) {x[2][x[2] == 0] <- -1;x})

Lub za pomocą pętli replace i for przypisz zmienione dane z powrotem do listy.

for (i in seq_along(listed)) {
  listed[[i]][2] <- replace(listed[[i]][2], listed[[i]][2] == 0, -1)
}

listed
#[[1]]
#  named one two
#1     1  -1   1
#2     2   2   0
#3     3  -1   3
#4     4   4   0
#5     5   5   0
#6     6  -1   6

#[[2]]
#  named two one
#1     1   1   0
#2     2  -1   2
#3     3   3   0
#4     4  -1   4
#5     5  -1   5
#6     6   6   0
2
Ronak Shah 26 czerwiec 2021, 12:13

Opcja z na_if/replace_na

library(dplyr)
library(tidyr)
library(purrr)
 map(listed, ~ .x %>% 
         mutate(across(2,  ~ replace_na(na_if(., 0), -1))))
[[1]]
  named one two
1     1  -1   1
2     2   2   0
3     3  -1   3
4     4   4   0
5     5   5   0
6     6  -1   6

[[2]]
  named two one
1     1   1   0
2     2  -1   2
3     3   3   0
4     4  -1   4
5     5  -1   5
6     6   6   0
0
akrun 26 czerwiec 2021, 19:29

Możesz użyć map z tidyverse:

library(tidyverse)

map(listed, ~ mutate_at(.x, .vars = colnames(.x)[length(colnames(.x))],
                        ~ case_when(. == 0 ~ -1, T ~ as.numeric(.))))

Ten kod przechodzi przez każdą ramkę danych w listed, identyfikuje tylko ostatnią kolumnę i zmienia wartości 0 na -1, jak w przykładzie z pętlą for.

Wynik:

[[1]]
  named one two
1     1   0   1
2     2   2  -1
3     3   0   3
4     4   4  -1
5     5   5  -1
6     6   0   6

[[2]]
  named two one
1     1   1  -1
2     2   0   2
3     3   3  -1
4     4   0   4
5     5   0   5
6     6   6  -1
0
Rory S 26 czerwiec 2021, 12:31

Możesz również użyć indeksu kolumn w poprzek

library(tidyverse)

map(listed, ~.x %>% mutate(across(2, ~replace(., .== 0, -1))))

#> [[1]]
#>   named one two
#> 1     1  -1   1
#> 2     2   2   0
#> 3     3  -1   3
#> 4     4   4   0
#> 5     5   5   0
#> 6     6  -1   6
#> 
#> [[2]]
#>   named two one
#> 1     1   1   0
#> 2     2  -1   2
#> 3     3   3   0
#> 4     4  -1   4
#> 5     5  -1   5
#> 6     6   6   0

Utworzony 26.06.2021 przez pakiet reprex (v2.0.0)

2
AnilGoyal 26 czerwiec 2021, 13:03