通过r中的最大数量条件合并两个数据帧

Merge two data frames by a max number condition in r

干杯,我有一个 2011 年游客最多的主要城市的数据框 df1。

df1:
Country      City             Visitors_2011
UK           London           100000
USA          Washington D.C   200000
USA          New York         100000
France       Paris            100000

另一个数据框 df2 包含 2012 年该国访问量最大的城市:

df2:
Country      City               Visitors_2012
USA          Washington D.C     200000
USA          New York           100000
USA          Las Angeles        100000
UK           London             100000
UK           Manchester         100000
France       Paris              100000
France       Nice               100000

我需要的输出是: 逻辑:要获得 df3,请按国家和城市合并 df1 和 df2,如果在 df1 中找不到城市,则将该卷添加到 df1 中最大的城市。 示例:这里的洛杉矶访客计数被添加到华盛顿 D.C 因为洛杉矶不在 df1 中并且华盛顿 D.C 的访客 (2012) 比纽约多。

df3:
Country      City             Visitors_2011    Visitors_2012
UK           London           100000           200000
USA          Washington D.C   200000           300000
USA          New York         100000           100000
France       Paris            100000           200000

谁能给我指出正确的方向?

假设 df1.txtdf2.txt 包含您的 space 分隔数据帧。

这是一个基于 R 的解决方案:

df1 <- read.table("df1.txt", header = T, stringsAsFactors = F);
df2 <- read.table("df2.txt", header = T, stringsAsFactors = F);

# Merge with all = TRUE, see ?merge 
df <- merge(df1, df2, all = TRUE);

# Deal with missing values
tmp <- lapply(split(df, df$Country), function(x) {
    # Make sure NA's are at the bottom
    x <- x[order(x$Visitors_2011), ];
    # Select first max Visitors_2012 entry
    idx <- which.max(x$Visitors_2012);
    # Add any NA's to max entry
    x$Visitors_2012[idx] <- x$Visitors_2012[idx] + sum(x$Visitors_2012[is.na(x$Visitors_2011)]);
    # Return dataframe
    return(x[!is.na(x$Visitors_2011), ])});
# Bind list entries into dataframe
df <- do.call(rbind, tmp);

print(df);
       Country           City Visitors_2011 Visitors_2012
France  France          Paris        100000        200000
UK          UK         London        100000        200000
USA.6      USA       New_York        100000        100000
USA.7      USA Washington_D.C        200000        300000

一个dplyr方法:

library(dplyr)
max.cities <- df1 %>% group_by(Country) %>% summarise(City = City[which.max(Visitors_2011)])
result <- df2 %>% mutate(City=ifelse(City %in% df1$City, City,
                                     max.cities$City[match(Country, max.cities$Country)])) %>%
                  group_by(Country,City) %>%
                  summarise(Visitors_2012=sum(Visitors_2012)) %>% 
                  left_join(df1,., by=c("Country", "City"))

备注:

  1. 首先,计算 df1 中有 max 位访问者 group_by CountryCity 并将其设置为单独的数据框 max.cities.
  2. mutate df2 中的 City 列,因此如果 Citydf1 中,则名称不变;否则,使用 max.cites 中的 CitymatchCountry
  3. 一旦 City 被适当修改,group_by CountryCity 并总结 Visitors_2012.
  4. 最后,left_join通过c("Country", "City")df1得到最后的result

使用您发布的数据的结果符合预期:

print(result)
##  Country           City Visitors_2011 Visitors_2012
##1      UK         London        100000        200000
##2     USA Washington D.C        200000        300000
##3     USA       New York        100000        100000
##4  France          Paris        100000        200000