2016-10-08 2 views
0

Ура, у меня есть кадр данных DF1 с Major City с макс посетителей в 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 

Выход я должен был бы это: Logic: для получения 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 

Может ли кто-нибудь указать мне направление вправо?

+0

Lookup 'match' и попробовать' DF3 <- df1; df3 $ Visitors_2012 <- df2 $ Visitors_2012 [match (df1 $ City, df2 $ City)]; ' –

+0

@Maurits это не объединит города, которые не находятся в df1, как задано вопросом. –

+1

@SairamReddy, вы, кажется, задаете много очень похожих вопросов. Возможно, попробуйте сосредоточиться на одном за раз. Может быть, инструменты для решения одной проблемы также решат другую. Это также поможет обеспечить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), а также показать нам, что вы пробовали , –

ответ

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_byCountry в df1 и установите это для sepa скорость данных фрейм max.cities.
  2. mutate столбец City в df2, так что если City находится в df1, то имя не изменяется; в противном случае City от max.cites используется match es Country.
  3. После того, как City был соответствующим образом изменен, group_by как Country, так и City и подвести итог Visitors_2012.
  4. И наконец, 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 
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