【问题标题】:How to avoid R converting F to False when converting logical vector to character将逻辑向量转换为字符时如何避免R将F转换为False
【发布时间】:2019-11-04 07:39:21
【问题描述】:

我从我的参与者那里导入了一些数据,其中我的一些变量是 F/M(女性/男性),当我导入它时,R 将只有 F 的向量转换为逻辑向量。然后当我将它们转换回字符时,F 已转换为 FALSE。如何避免这种 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()

【问题讨论】:

  • stringsAsFactors=FALSE 在您的read.(csv/tsv/table) 通话中?测试csv_data %&gt;% map(.,class)
  • 请尝试as.is of read.csv 以避免转换
  • stringsAsFactors=FALSE 不是read_csv 选项。 col_types = ... 应该可以工作。
  • 您可以将所有列读取为字符并稍后转换它们。可以灵活地读取所有字符,将“f”和“m”更改为“female”和“male”,然后使用type_convert 或类似的东西更改列类型。要使用 read_csv 以字符形式读取所有内容,请添加 col_types = cols(.default = "c")
  • 您能否添加用于导入数据的代码?

标签: r


【解决方案1】:

感觉不是很干净,不过我在评论里说的就是这种流程。您不需要指定特定的列名(因此它有点灵活)。但是,如果有几列导致问题的名称相同,那会更容易。祝你好运!!

# 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)

【讨论】:

  • 是的,幸运的是,这个问题仅限于几列,所以我采用了另一种方法,但是当情况并非如此时,这非常有用。谢谢!
  • 越简单越好!
【解决方案2】:

如果您知道有问题的列是first_sexsecond_sex,则可以使用readr 中的col_* 处理程序。例如:

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

【讨论】:

    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多