【问题标题】:matching if string values are equal, creating a new string value in new column in R如果字符串值相等则匹配,在 R 的新列中创建一个新的字符串值
【发布时间】:2016-06-01 14:02:28
【问题描述】:

我正在尝试在 R 中执行一种“if”语句,我想在其中查找两个值(字符串)在两个不同的列中是否相同。例如,如果我的 Origin 和 Destination country 相同,我想创建一个新列,结果是国内。如果为 false,那么最终我会将 NA 编码为 International。

我在 R 中尝试了几个函数,但仍然无法正常使用!

我认为汽车库中的重新编码功能可能适合。这是我尝试过的数据示例和两个代码行示例。 感谢您的帮助。

#Data
Origin.Country <- c("Canada","Vietnam","Maldives", "Indonesia", "Spain",     "Canada","Vietnam")
Passengers <- c(100, 5000, 200, 10000, 200, 20, 4000)
Destination.Country <- c("France","Vietnam","Portugal", "Thailand", "Spain", "Canada","Thailand")

data2<-data.frame(Origin.Country, Destination.Country, Passengers)

#Creating new column
data2$Domestic<-NA 

#If Origin and Destination is the same = Domestic
data2$Domestic[data2$Origin.Country==data2$Destination.Country <- Domestic

data2$Domestic <- recode(data2$Origin.Country, c(data2$Destination.Country)='Domestic', else='International')

【问题讨论】:

  • c('Int\'l', 'Domestic')[(Origin.Country == Destination.Country) + 1L]

标签: r if-statement conditional-statements r-car recode


【解决方案1】:

你可以使用ifelse:

data2$Domestic <- ifelse(as.character(data2$Origin.Country) == 
                         as.character(data2$Destination.Country), 
                         'Domestic', 'International')

我使用as.character 将国家名称变量强制为字符以进行比较。 ifelse 将逻辑作为第一个参数,如果为 TRUE,则返回第二个参数,如果为 FALSE,则返回第三个参数。在这种情况下,它按行对变量进行比较。

【讨论】:

  • 太棒了!它也适用于我的大型数据集。非常感谢@Imo。
【解决方案2】:

这可能有点慢,因为它没有矢量化,但它根据您的示例工作:

data2$domestic <- apply(data2, 1, function(x) {
    ( x["Origin.Country"] == x["Destination.Country"] )
} )

【讨论】:

  • 我已经尝试了我提供的示例并且它有效(结果为真和假)。但是,我正在处理一个非常大的数据集并且它不起作用..没有结果出现..
  • 您有任何错误吗?您的列是否与示例中的名称相同?
【解决方案3】:

你可以这样使用recode

library(dplyr); library(car)
data2 %>% mutate(Domestic = recode(as.character(Origin.Country) == as.character(Destination.Country), 
                                   "TRUE='domestic'; else='international'"))

  Origin.Country Destination.Country Passengers      Domestic
1         Canada              France        100 international
2        Vietnam             Vietnam       5000      domestic
3       Maldives            Portugal        200 international
4      Indonesia            Thailand      10000 international
5          Spain               Spain        200      domestic
6         Canada              Canada         20      domestic
7        Vietnam            Thailand       4000 international

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多