如果字符串值相等则匹配,在R中的新列中创建新的字符串值

时间:2016-06-01 14:02:29

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

我正在尝试在R中执行一种'if'语句,我希望在两个不同的列中找到两个值(字符串)相同。例如,如果我的Origin和我的Destination国家/地区相同,我想创建一个包含Domestic的新列。如果为假,那么我最终会将NA编码为国际。

我在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')

3 个答案:

答案 0 :(得分:1)

您可以使用ifelse

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

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

答案 1 :(得分:0)

这可能有点慢,因为它没有矢量化,但它的工作原理基于你的例子:

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

答案 2 :(得分:0)

您可以这样使用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