替换数据框中的当前值的问题

时间:2018-04-09 17:33:19

标签: r

我正在尝试将每列中某个国家/地区的每个缩写的值替换为其实际名称(即" USA" to" 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

这是使用上述方法的样子。我得到错误&#34;无效因子级别,NA生成&#34;但我认为stringsAsFactors = FALSE将解决该问题。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

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

您有几种选择:

  1. read_csv套餐包中的某个地方使用tidyverse - 它没有明确做到这一点。
  2. 向您的stringsAsFactors = FALSE功能添加选项read.csv
  3. 更改因子的级别而不是值
  4. 对于最后一个选项,(再次)存在多个选项。基本R方法是:

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

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

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

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