这是我问的第一个问题,所以我希望我能尽我所能......
我正在努力简化一些数据,特别是字符串。我有一个数据框,其中包含正在工作的组件的制造商名称,但它们以许多不同但相似的方式输入。
为了使用更常见的名称,我将更改为汽车公司。例如“福特汽车公司”、“福特”、“FoMoCo”。 “Telsa”、“Telsa Inc.”、“丰田”、“日本丰田”、“本田”、“本田汽车(日本)有限公司”之类的东西。
我想将这些全部更改为一个简化的字符串,例如“Ford”“Tesla”等。本质上是通过整个数据框进行查找和替换。我尝试使用 str_replace_all 并取得了一些成功。似乎我必须将它用于每种可能的结果,并且由于某种原因它不适用于“本田汽车(日本)有限公司”。
此外,因为我有大量福特和特斯拉的加权数据,所以我想拒绝任何不是福特或特斯拉的东西,只是称它们为“其他”。我不知道如何处理。某种案例陈述?我猜我可以遵循 str_replace_all 模式,但如果我稍后想要/需要它,我不一定想销毁数据框中的数据。也许我只是创建一个新的 df 并进行更改...
我可以在 Excel 中使用过滤器执行此操作,并使用查找替换全部手动更改它,但这很麻烦,我必须每周左右手动执行一次,当我提取数据时,我知道这不是最优雅的计算方法出去对我的未来没有帮助。
让我们尝试重现
mfg <- c("Ford Motor Company", "Ford Co.", "FoMoCo.", "Tesla", "Tesla Inc.", "Toyota", "Toyota of Jpn", "Honda Motors", "Honda Motors (Japan) Co., Ltd." )
sales <- c(12, 14, 5, 50, 20, 30, 22, 50, 11)
df <- data.frame(mfg, sales)
ford_str <- c("Ford Motor Company" = "Ford", "Ford Co." = "Ford", "FoMoCo." = "Ford")
df$mfg <- str_replace_all(CarSales$mfg,ford_str)
通常有助于琴弦。但由于某种原因不适用于“本田汽车(日本)有限公司”。它将取代本田的所有其他版本,但不会取代“本田汽车(日本)有限公司”。
我不知道福特、特斯拉、其他的情况如何。
如果您将所有制造商名称值都放在一个命名向量中,则可以使用“查找”来执行此操作,然后用“其他”替换缺失的值:
library(tidyverse)
df <- tibble::tribble(
~mfg, ~sales,
"Ford Motor Company", 12,
"Ford Co.", 14,
"FoMoCo.", 5,
"Telsa", 50,
"Telsa Inc.", 20,
"Toyota", 30,
"Toyota of Jpn", 22,
"Honda Motors", 50,
"Honda Motors (Japan) Co., Ltd.", 11
)
car_names <-
c(
"Ford Motor Company" = "Ford",
"Ford Co." = "Ford" ,
"FoMoCo." = "Ford",
"Honda Motors" = "Honda",
"Honda Motors (Japan) Co., Ltd." = "Honda"
)
df |>
mutate(cartype = car_names[mfg]) |>
replace_na(list(cartype = "Other"))
#> # A tibble: 9 × 3
#> mfg sales cartype
#> <chr> <dbl> <chr>
#> 1 Ford Motor Company 12 Ford
#> 2 Ford Co. 14 Ford
#> 3 FoMoCo. 5 Ford
#> 4 Telsa 50 Other
#> 5 Telsa Inc. 20 Other
#> 6 Toyota 30 Other
#> 7 Toyota of Jpn 22 Other
#> 8 Honda Motors 50 Honda
#> 9 Honda Motors (Japan) Co., Ltd. 11 Honda