【问题标题】:matching characters of two columns of two different data frames and label them匹配两个不同数据帧的两列的字符并标记它们
【发布时间】:2016-05-25 13:45:37
【问题描述】:

这是我的主要数据

 Country Consumption Rank
Belarus        17.5    1
 Moldova        16.8    2
Lithuania        15.4    3
  Russia        15.1    4
 Romania        14.4    5
 Ukraine        13.9    6

我还收集了这些大陆的其他数据框,例如:

 europe
Albania
 Andorra
Armenia
 Austria
Azerbaijan
Belarus

或其他数据框,如

  asia
Afghanistan
 Bahrain
 Bangladesh
  Bhutan
  Brunei

6 缅甸(缅甸)

我想将我的数据国家与我拥有的大陆国家数据框相匹配,然后用欧洲或亚洲等大陆标记它们

这是我管理但不匹配的代码,所以 else if 只执行:

 if ( data$Country %in% europe$europe) {
 data$con<-c("Europe")
} else if ( data$Country %in% asia$asia) {
 data$con<-c("asia")
 } else if ( data$Country %in% africa$africa) {
data$con<-c("africa")
    } else
    data$con<-c("ridi")

提前谢谢你。

【问题讨论】:

    标签: r dataframe match multiple-columns


    【解决方案1】:

    首先,构建从国家到大陆的地图:

    continent_map = stack(c(europe, asia))
    names(continent_map) <- c("Country", "Continent")
    

    然后,使用match:

    dat["Continent"] = continent_map$Continent[ match(dat$Country, continent_map$Country) ]
    
        Country Consumption Rank Continent
    1   Belarus        17.5    1    europe
    2   Moldova        16.8    2      <NA>
    3 Lithuania        15.4    3      <NA>
    4    Russia        15.1    4      <NA>
    5   Romania        14.4    5      <NA>
    6   Ukraine        13.9    6      <NA>
    

    通常,您应该将相关数据保存在一个单一的结构中,例如 continent_map(而不是像 OP 的 asiaeurope 这样的许多单独的地方)。


    使用的数据:

    dat = structure(list(Country = c("Belarus", "Moldova", "Lithuania", 
    "Russia", "Romania", "Ukraine"), Consumption = c(17.5, 16.8, 
    15.4, 15.1, 14.4, 13.9), Rank = 1:6), .Names = c("Country", "Consumption", 
    "Rank"), row.names = c(NA, -6L), class = "data.frame")
    europe = structure(list(europe = c("Albania", "Andorra", "Armenia", "Austria", 
    "Azerbaijan", "Belarus")), .Names = "europe", row.names = c(NA, 
    -6L), class = "data.frame")
    asia = structure(list(asia = c("Afghanistan", "Bahrain", "Bangladesh", 
    "Bhutan", "Brunei")), .Names = "asia", row.names = c(NA, -5L), class = "data.frame")
    

    【讨论】:

    • 就像任何其他方法一样,它只是出于某种原因在所有国家/地区的大陆列中返回 NA!我什至确保它们都是类字符,仍然不匹配或 ifelse 除了返回 NAs
    • 按照 lmo 的建议,尝试运行我们每个答案中的代码(包括读取数据的部分),以更好地调查您的问题。这类问题(您和回答者仅仅因为您的示例数据不明确而得到不同的结果)就是为什么建议发布最少的可重现示例stackoverflow.com/a/28481250
    【解决方案2】:

    这是使用ifelse 的一种方法。我稍微修改了您的数据,以便您可以看到它适用于亚洲和欧洲

    # get your data
    df <- read.table(text="Country Consumption Rank
    Belarus        17.5    1
                      Brunei        16.8    2
                      Lithuania        15.4    3
                      Austria        15.1    4
                      Romania        14.4    5
                      Ukraine        13.9    6
                      Bangladesh      24.2   5", header=T)
    
    df.europe <- read.table(text=" europe
    Albania
                              Andorra
                              Armenia
                              Austria
                              Azerbaijan
                              Belarus", header=T, as.is=T)
    
    df.asia <- read.table(text="asia
    Afghanistan
                      Bahrain
                      Bangladesh
                      Bhutan
                      Brunei", header=T, as.is=T)
    
    # use ifelse to get categories
    df$con <- ifelse(df$Country %in% df.europe$europe, "europe", 
                     ifelse(df$Country %in% df.asia$asia, "asia", NA))
    

    将嵌套的ifelse 保持在最低限度通常是个好主意,但对于这样一个包含数千个观察值的数据集,它会很好。

    【讨论】:

    • Fwiw,他们说 asiaeurope 是数据帧,而不是向量。
    • 是的,我本来就是这样的,但为了美观而改变了它,可能更好地保持它更真实的原作。谢谢。
    • 复制并粘贴以上所有代码。您将看到它产生非 NA 值。我刚刚使用新版本的 R 进行了尝试。您的问题可能是您将 Country 变量存储为一个因素。使用字符变量更容易。这就是我在 read.table 函数中使用 as.is=TRUE 参数的原因。
    猜你喜欢
    • 2022-10-07
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2020-10-10
    • 2021-11-14
    • 2021-01-16
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多