Почему я не могу изменить тип некоторых столбцов, когда кадры данных находятся внутри списка? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытался запустить некоторую часть кода в rstudio, которая идентифицирует столбцы, которые являются факторами, и затем изменяет их на символьные.
Когда я пытаюсь сделать это за l oop, это работает хорошо, но для того, чтобы код выглядел лучше и чтобы моя работа была выполнена проще.
Итак, я поместил все фреймы данных, которые мне нужны, чтобы изменить тип столбцов с фактора на символ внутри списка, и запустил их внутри для l oop, но это не сработало.
Вот оба кода:

# Это хорошо работает

i <- sapply(falha, is.factor)
falha[i] <- lapply(falha[i], as.character)

# Это не работает

tab_list <- list(espacamento, falha, talhao, censo)
for (x in tab_list){ 
  i <- sapply(x, is.factor) 
  x[i] <- lapply(x[i], as.character) 
} 

1 Ответ

1 голос
/ 29 апреля 2020

Проблема в том, что когда вы делаете for(x in tab_list), то в каждой итерации l oop, x есть копия каждого элемента в списке. Это , а не псевдоним для элемента в списке. Вот очень простой пример:

my_list <- list(1, 1)
my_list
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 1

for(x in my_list) {x <- 2}
my_list
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 1

Если бы x было ссылкой на элемент в списке, то исходный список был бы изменен, но это не так.

Это часто полезно разбить такую ​​проблему на более простые части. В вашем случае вы можете написать функцию, которая хорошо работает с одним фреймом данных:

factor_to_char <- function(x){
  are_factors <- sapply(x, is.factor)
  x[, are_factors] <- as.character(x[, are_factors])
  return(x)
}

Затем вы можете легко применить ее ко всем фреймам данных в вашем списке с помощью lapply:

lapply(tab_list, factor_to_char)

Или, если вы действительно хотите использовать al oop, вы можете сделать:

for(i in seq_along(tab_list)) {
  tab_list[[i]] <- factor_to_char(tab_list[[i]])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...