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

时间:2016-10-08 07:25:32

标签: r dataframe dplyr plyr dt

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

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

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

假设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

答案 1 :(得分:0)

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. 首先,在City中计算max访客group_by Country的{​​{1}},并将其设置为单独的数据框df1
  2. max.cities mutate中的City列,以便df2位于City时,名称不变;否则,使用df1 City max.cites的{​​{1}} {/ 1}}。
  3. match做出适当修改后,Country Citygroup_by并总结Country
  4. 最后,City Visitors_2012 left_join df1获得最终c("Country", "City")
  5. 使用您发布的数据的结果符合预期:

    result