【问题标题】:Change column value based on another column, but only for certain conditions in the first AND second column (R)根据另一列更改列值,但仅适用于第一列和第二列 (R) 中的某些条件
【发布时间】:2018-10-24 11:08:33
【问题描述】:

我有一个数据框。

city <- as.character(c("London", "Unknown", "Birmingham", "Bristol", "Unknown", "Unknown", "Unknown", "Unknown"))
city_details <- as.character(c("London", "Camden", "Birmingham", "Outside London", "Camden Town", "Westminster", "London", "Birmingham"))
city_data <- data.frame(city, city_details)

尽管 city 列中的一些值是未知的,但查看 city_details 会发现其中大部分实际上都在伦敦。

所以,我可以替换其中的一些:

city_data$city[grepl("Camden|Westminster", city_data$city_details)] <- 'London'

但是,在 city_details 中显示“London”的那个更难,因为还有一个显示“Outside London”,所以我不想只拿起任何有“London”的东西里面的图案。

出于此目的,我不是在寻找一种只包含完全匹配的方法(因为这对于我的真实数据来说并不完全正确)。

所以我想做的只是对未知的城市值执行此替换。

目前我尝试了以下方法,但显然逻辑不正确,因为它实际上所做的只是将城市列中的所有未知值更改为伦敦。

city_data <- within(city_data, city[city == "Unknown"] <- (city[grepl("London", city_details)] <- 'London'))

谁能帮忙?

【问题讨论】:

    标签: r dataframe grepl


    【解决方案1】:

    我假设您只想在 city 未知且 city_details 提到“伦敦”时替换城市名称。在这种情况下,您可以使用以下内容:

    city_data$city[(as.numeric(grepl("Unknown", city)) + as.numeric(grepl("London", city_details))) == 2] &lt;- "London"

    这能回答你的问题吗?

    【讨论】:

    • 这似乎确实有效 - 谢谢!我还在同一行中包含了其他 city_details:city_data$city[(as.numeric(grepl("Unknown", city)) + as.numeric(grepl("London|Camden|Westminster", city_details))) == 2] &lt;- "London"
    【解决方案2】:

    我建议如下:

    one_hot <- grepl("Camden|Westminster|London", city_data$city_details) &
      city_data$city == "Unknown"
    city_data$city[one_hot] <- "London"
    

    例子:

    city <- as.character(c("London", "Unknown", "Birmingham", "Bristol", "Unknown", "Unknown", "Unknown", "Unknown"))
    city_details <- as.character(c("London", "Camden", "Birmingham", "Outside London", "Camden Town", "Westminster", "London", "Tottenham"))
    city_data <- data.frame(city, city_details)
    
    > city_data
            city   city_details
    1     London         London
    2    Unknown         Camden
    3 Birmingham     Birmingham
    4    Bristol Outside London
    5    Unknown    Camden Town
    6    Unknown    Westminster
    7    Unknown         London
    8    Unknown      Tottenham
    
    > one_hot <- grepl("Camden|Westminster|London", city_data$city_details) &
    +   city_data$city == "Unknown"
    > city_data$city[one_hot] <- "London"
    > city_data
            city   city_details
    1     London         London
    2     London         Camden
    3 Birmingham     Birmingham
    4    Bristol Outside London
    5     London    Camden Town
    6     London    Westminster
    7     London         London
    8    Unknown      Tottenham
    

    【讨论】:

    • 谢谢。对我来说,这给了我与我之前尝试过的结果相同的结果,即所有未知数都更改为伦敦,而不是那些包含任何提到的字符串模式的未知数。
    • 我认为这只是您的示例,因为所有具有值 Unknowncity 条目都有一个与模式匹配的 city_detail
    • 抱歉,我在测试代码时确实调整了代码以包含一个不是伦敦但没有更新问题的未知城市 - 我现在将进行编辑以使其更清晰。但是由于未知的不是伦敦,所以当我运行它时,它仍然是伦敦。
    • 哦,真的。我的回答有误。有了新的编辑,我的解决方案也应该可以工作。
    【解决方案3】:

    我还想出了下面的方法,这对我来说似乎更简洁、更直观。无需转换为数字。

    city_data$city[grepl("Unknown", city_data$city) & 
                   grepl("London|Camden|Westminster", city_data$city_details)] <- "London"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多