干杯,我有一个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.txt
和df2.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"))
指出:
- 首先,计算
df1
中max
访问者group_by
Country
的City
,并将其设置为单独的数据帧max.cities
。 -
mutate
删除df2
中的City
列,如果City
在df1
中,则名称不变;否则,使用match
与Country
对应的max.cites
中的City
。 - 一旦
City
被适当地修改,group_by
、Country
和City
和Visitors_2012
的总和。 - 最后,
left_join
与df1
通过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