【问题标题】:Create a dummy if any of a number of conditions is met如果满足多个条件中的任何一个,则创建一个假人
【发布时间】:2016-04-03 10:11:42
【问题描述】:

如果某项行动发生在首都,并且我的数据集包含 34 个国家/地区,我想创建一个假人。此外,有时可能会出现单词位于较大字符串中的情况(例如“Berlin, Germany, DE”)。

假设列如下所示:

      Location
1    Manchester
2    Berlin
3    Paris, France
4    Kansas

我希望 Dummy 产生以下输出:

      Location          Capital_Dummy
1    Manchester               0
2    Berlin                   1
3    Paris, France            1
4    Kansas                   0

知道我该怎么做吗?

我尝试了以下方法,我希望这至少适用于仅在列中出现大写字母名称但即使这样也没有成功(为简单起见将其缩短)的情况:

capital <- c(“Madrid”, “Berlin”, “Paris”, “Prague”, “Bratislava”)

capital_dummy[df$event_location == capital] <- 1

问题的解决方案,由 David Arenburg 提出:

capital <- c("Madrid", "Berlin", "Paris", "Prague", "Bratislava")

capital_dummy <- grepl(paste(capital, collapse = "|"), df$Location) + 0L

【问题讨论】:

  • 试试%in% 而不是==
  • 也不工作。但是感谢您的帮助! :)
  • 什么不起作用?你得到什么错误?您能否创建一个可重现的示例以提供所需的输出?
  • 也许可以试试grepl(paste(capital, collapse = "|"), df$Location) + 0L。并请在capital 中正确引用。 R 无法识别。使用"'
  • 如果您有 Paris, France 之类的东西 - 第一个解决方案将无法正常工作。您是否尝试过grepl 解决方案?

标签: r dataframe dummy-variable


【解决方案1】:

假设您在变量位置中有非结构化文本,您可以使用grepl 来匹配您的大写字母

df <- data.frame(location = c("Manchester", "Berlin", 
                              "Paris, France", "Kansas"))

capital <- c("Madrid", "Berlin", "Paris", "Prague", "Bratislava")

capital_dummy_matrix <- sapply(
    X = paste0("*", capital, "*"), # Pattern for your capitals
    FUN = grepl,
    x = df$location, 
    ignore.case = TRUE)

df$capital_dummy <- apply(
    X = capital_dummy_matrix, 
    MARGIN = 1, 
    FUN = max)

df

> df
       location capital_dummy
1    Manchester             0
2        Berlin             1
3 Paris, France             1
4        Kansas             0

这会产生您想要的输出。但是,如果您提供有关数据结构的更多信息,可能会有更简单的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2022-12-15
    • 2018-11-29
    • 2020-02-13
    相关资源
    最近更新 更多