【问题标题】:Efficient way to replace all column values using list of strings R使用字符串列表R替换所有列值的有效方法
【发布时间】:2021-01-09 20:40:33
【问题描述】:

我有一个名为 car 的数据框,我正在尝试替换名为 make 的列中的某些值,其中包含许多独特的汽车品牌。我正在尝试将包含我的名为car_list 的字符列表的任何值替换为值low_frequency。但是我只想要整个字符串替换,而不是我通过使用边界所做的部分替换。

“汽车”的“制造”列如下所示:

 make
 "LANDROVER"
 "VOLKSWAGEN"
 "VAUXHALL"
 "MG-MOTOR UK"
 "ROVER"
 "BWM"

'car_list` 看起来像这样:

"MG-MOTOR UK"
"ROVER"
"ROBIN"

我将make 中包含在car_list 中的所有值替换为新值low_frequency。输出应如下所示:

 make
 "LANDROVER"
 "VOLKSWAGEN"
 "VAUXHALL"
 "low_frequency"
 "low_frequency"
 "BWM"

我的尝试是使用 gsub 和 for 循环,因为我已经习惯了 python,但我知道这在 R 中是不好的做法,解决方案会崩溃:

for (string in car_list){
  car['make'] <- gsub(paste('\\b', string, '\\b', sep = ''), 'low_frequency', car['make'])}

任何帮助将不胜感激。

【问题讨论】:

    标签: r regex string list


    【解决方案1】:

    使用replace

    replace(car$make, car$make %in% car_list, "low_frequency")
    # [1] "LANDROVER"     "VOLKSWAGEN"    "VAUXHALL"      "low_frequency" "low_frequency" "BWM"
    

    ""

    replace(car[["make"]], car[["make"]] %in% car_list, "low_frequency")
    

    看起来像这样的函数:

    FUN <- function(x) replace(car[[x]], car[[x]] %in% car_list, "low_frequency")
    FUN("make")
    # [1] "LANDROVER"     "VOLKSWAGEN"    "VAUXHALL"      "low_frequency" "low_frequency" "BWM"    
    
      
    

    数据:

    car <- structure(list(make = c("LANDROVER", "VOLKSWAGEN", "VAUXHALL", 
    "MG-MOTOR UK", "ROVER", "BWM")), class = "data.frame", row.names = c(NA, 
    -6L))
    
    car_list <- list("MG-MOTOR UK", "ROVER", "ROBIN")
    

    【讨论】:

    • 有没有办法使用car['make'] 格式做到这一点?
    • 这样做的原因是,如果我把它放在一个函数中并将make 替换为column 以使解决方案可用于其他列,我无法输入car$column
    • @geds133 我明白,不过你需要双倍的[[,请参阅编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多