根据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中的最大城市。示例:这里的洛杉矶游客数量被添加到华盛顿特区,因为洛杉矶不存在于df1中,而华盛顿特区的游客数量(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包含空格分隔的数据框。

这是一个以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. 首先,计算df1max访问者group_by CountryCity,并将其设置为单独的数据帧max.cities
  2. mutate删除df2中的City列,如果Citydf1中,则名称不变;否则,使用matchCountry对应的max.cites中的City
  3. 一旦City被适当地修改,group_byCountryCityVisitors_2012的总和。
  4. 最后,left_joindf1通过c("Country", "City")得到最终的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

最新更新