Как избежать преобразования R в F в False при преобразовании логического вектора в символ - PullRequest
3 голосов
/ 21 июня 2019

Я импортировал некоторые данные от моих участников, где некоторые из моих переменных - F / M (женский / мужской), и когда я импортирую их, R преобразует векторы только с F в логический вектор.Когда я затем преобразовываю их обратно в символ, F был преобразован в ЛОЖЬ.Как я могу избежать этого преобразования F в FALSE?

Я знаю, что могу просто преобразовать все FALSE обратно в F, но я бы хотел найти альтернативное решение, чтобы мой код не выглядел загроможденным.

Это мой код на данный момент, и я подозреваю, что проблема в lapply.Я не могу дать полный набор данных, так как команда включена в чтение CSV-файлов.Я привел пример того, как данные выглядят в CSV-файле, и как они выглядят, когда R преобразовал их.Фактический набор данных имеет еще много столбцов.

library(tidyverse)

csv_data <- data.frame(first = c(1, 1, 1, 1),
                first_sex = c("F", "F", "F", "F"),
                second = c(2, 2, 2, 2),
                second_sex = c("M", "F", "F", "F"))

R_output_data <- data.frame(first = c(1, 1, 1, 1),
                            first_sex = c(F, F, F, F),
                            second = c(2, 2, 2, 2),
                            second_sex = c("M", "F", "F", "F"))

files <- list.files(path = "path to data", 
                    pattern = "*.csv", full.names = T)

test_data <- lapply(files, read_csv) %>% 
  lapply(.,mutate_if, is.logical, as.character) %>%
  bind_rows()

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Если вы знаете, что проблемными столбцами являются first_sex и second_sex, вы можете использовать обработчики col_* из readr. Например:

require(readr)    
notlogical<-cols(first_sex=col_character(),second_sex=col_character())
#then in the lapply:
test_data <- lapply(files, read_csv, col_types=notlogical) #the rest is the same
1 голос
/ 21 июня 2019

Это не кажется очень чистым, но этот тип процесса - то, о чем я говорил в комментарии.Вам не нужно указывать конкретные имена столбцов (так что это несколько гибко).Но если есть пара столбцов, вызывающих проблему с одинаковыми именами, это будет проще.Удачи !!

# Reading in all data as character using read_csv
test_data <- lapply(files, read_csv, col_types = cols(.default = "c"))

# using gsub to swap out f for female
test_data2 <- lapply(rapply(test_data, function(x) gsub("F|f", "Female", gsub("M|m", "Male", x)), 
how = "list"), as.data.frame, stringsAsFactors = F)

# Converting type for each dataframe in the list
final_data <- lapply(test_data2, type_convert)


# Checking if it worked
final_data[[1]]
  first first_sex second second_sex
1     1    Female      2       Male
2     1    Female      2     Female
3     1    Female      2     Female
4     1    Female      2     Female

sapply(final_data[[1]], class)
      first   first_sex      second  second_sex 
  "numeric" "character"   "numeric" "character" 

Данные

csv_data <- data.frame(first = c(1, 1, 1, 1),
                       first_sex = c("F", "F", "F", "F"),
                       second = c(2, 2, 2, 2),
                       second_sex = c("M", "F", "F", "F"))


write_csv(csv_data, "csv_data.csv")
write_csv(csv_data, "csv2_data.csv")

files <- list.files(path = getwd(), 
                    pattern = "data.csv", full.names = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...