通过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.txt
和 df2.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"))
备注:
- 首先,计算
df1
中有 max
位访问者 group_by
Country
的 City
并将其设置为单独的数据框 max.cities
.
mutate
df2
中的 City
列,因此如果 City
在 df1
中,则名称不变;否则,使用 max.cites
中的 City
即 match
是 Country
。
- 一旦
City
被适当修改,group_by
Country
和 City
并总结 Visitors_2012
.
- 最后,
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
干杯,我有一个 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.txt
和 df2.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"))
备注:
- 首先,计算
df1
中有max
位访问者group_by
Country
的City
并将其设置为单独的数据框max.cities
. mutate
df2
中的City
列,因此如果City
在df1
中,则名称不变;否则,使用max.cites
中的City
即match
是Country
。- 一旦
City
被适当修改,group_by
Country
和City
并总结Visitors_2012
. - 最后,
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