干杯,我的主要城市数据框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
有人能指出我正确的方向吗?
答案 0 :(得分:1)
假设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
答案 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"))
注意:
City
中计算max
访客group_by
Country
的{{1}},并将其设置为单独的数据框df1
max.cities
mutate
中的City
列,以便df2
位于City
时,名称不变;否则,使用df1
City
max.cites
的{{1}} {/ 1}}。match
做出适当修改后,Country
City
和group_by
并总结Country
。City
Visitors_2012
left_join
df1
获得最终c("Country", "City")
。使用您发布的数据的结果符合预期:
result