【问题标题】:Issues with replacing current values in a dataframe替换数据框中的当前值的问题
【发布时间】:2018-04-10 01:43:19
【问题描述】:

我正在尝试将每列中每个国家/地区的每个缩写的值替换为其实际名称(即“USA”到“United States”)。数据框超过 10,000 行。我尝试了很多方法,包括下面的代码,仍然无法更新值。我也用 %in% 尝试了同样的语句。

starbucks_data = read.csv("starbucksdata.csv", header = TRUE)
starbucks_data1 = starbucks_data[!(is.na(starbucks_data)),]
new_starbucks_data = starbucks_data1[,c("Brand","City", "Country")]

new = data.frame(new_starbucks_data, stringsAsFactors = FALSE)
new$Country[new$Country == "AD"] <- "Andorra"
new

Sample output

这就是上面方法的样子。我收到错误“无效因子级别,NA 生成”,但我认为 stringsAsFactors = FALSE 可以解决该问题。任何帮助,将不胜感激。

【问题讨论】:

  • 您的国家/地区缩写可能被编码为因素。首先将您的缩写转换为字符或将您的 read.csv 行更改为 read.csv("starbucksdata.csv", header = TRUE, stringsAsFactors = FALSE)
  • 谢谢你,成功了。

标签: r


【解决方案1】:

当您使用read.csv 时问题就开始了 - 该函数会自动将所有字符串转换为因子。当您创建新数据框时,不将任何字符串转换为因子并不重要 - 因为它们已经是因子。

您有多种选择:

  1. 在 tidyverse 软件包套件中的某处使用 read_csv - 它特别不这样做。
  2. 将选项 stringsAsFactors = FALSE 添加到您的 read.csv 函数中。
  3. 更改因子的水平而不是值

对于最后一个选项,(再次)存在多个选项。基本的R方法是这样做的:

levels(new$country) <- c("new1", "new2", ...)

(将... 替换为您想要的名称列表)。 这可能有点危险,因为您必须将它们完美排列才能获得正确的结果。使用forcats 包的替代方案(tidyverse 的一部分使用函数fct_recode 来显式重新编码每个因素:

new$country <- fct_recode(
  Andorra = "AD",
  `United States` = "USA")

等等。 (当涉及到空格时,您可能需要使用引用。我没有测试这方面的内容。)

【讨论】:

    猜你喜欢
    • 2012-06-19
    • 2020-04-27
    • 2013-02-04
    • 2020-12-01
    • 1970-01-01
    • 2014-11-12
    • 2014-12-15
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多