Обновите фрейм данных вторым фреймом данных - PullRequest
0 голосов
/ 19 марта 2019

У меня есть нулевой фрейм данных, который представляет промежуток времени для выбора городов и три результата теста:

cities <- c('Boston', 'Chicago', 'Denver', 'HOuston', 'LosAngeles', 'Miami', 'NewYork', 'WashingtonDC')
years <- 2014:2018
df <- expand.grid(Year=years, City=cities, TestA=0, TestB=0, TestC=0)
df[with(df, order(Year, City)),]
head(df,12)

#    Year    City TestA TestB TestC
#1  2014  Boston     0     0     0
#2  2015  Boston     0     0     0
#3  2016  Boston     0     0     0
#4  2017  Boston     0     0     0
#5  2018  Boston     0     0     0
#6  2014 Chicago     0     0     0
#7  2015 Chicago     0     0     0
#8  2016 Chicago     0     0     0
#9  2017 Chicago     0     0     0
#10 2018 Chicago     0     0     0
#11 2014  Denver     0     0     0
#12 2015  Denver     0     0     0

Я хочу обновить его, используя второй фрейм данных, который выглядит следующим образом:

dfUpdate <- data.frame(Year=c(2016, 2015), City=c('Boston', 'Chicago'), 
TestA=c(12.23, 16.01), TestB=c('Joe', 'Sally'), TestC=c(1000, 1500) )
dfUpdate

#  Year    City TestA TestB TestC
#1 2016  Boston 12.23   Joe  1000
#2 2015 Chicago 16.01 Sally  1500

После обновления исходный фрейм данных должен выглядеть следующим образом:

#    Year    City TestA TestB TestC
# 1  2014  Boston     0     0     0
# 2  2015  Boston     0     0     0
# 3  2016  Boston 12.23   Joe  1000
# 4  2017  Boston     0     0     0
# 5  2018  Boston     0     0     0
# 6  2014 Chicago     0     0     0
# 7  2015 Chicago 16.01 Sally  1500
# 8  2016 Chicago     0     0     0
# 9  2017 Chicago     0     0     0
# 10 2018 Chicago     0     0     0
# ...

Обновления всегда будут иметь значения года и города, которые указаны в 'df'.Фактическое приложение будет иметь более десяти тысяч наблюдений за «df», так как будет много лет и городов.Обновленный фрейм данных 'dfUpdate' может иметь несколько сотен наблюдений.

Я вижу некоторые другие решения по переполнению стека, но они отличаются тем, что у фрейма данных есть один индекс.

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Обязательно используйте stringsAsFactors = F при чтении фреймов данных, чтобы избежать преобразования строк в факторы.Затем используйте for петлю в базе R

for(i in 1:nrow(dfUpdate)) {
  df[df$Year == dfUpdate$Year[i] & df$City == dfUpdate$City[i], -c(1:2)] = dfUpdate[i, -c(1:2)]
}

> df
Year         City TestA TestB TestC
1  2014       Boston  0.00     0     0
2  2015       Boston  0.00     0     0
3  2016       Boston 12.23   Joe  1000
4  2017       Boston  0.00     0     0
5  2018       Boston  0.00     0     0
6  2014      Chicago  0.00     0     0
7  2015      Chicago 16.01 Sally  1500
8  2016      Chicago  0.00     0     0
9  2017      Chicago  0.00     0     0
10 2018      Chicago  0.00     0     0
11 2014       Denver  0.00     0     0
12 2015       Denver  0.00     0     0
13 2016       Denver  0.00     0     0
14 2017       Denver  0.00     0     0
15 2018       Denver  0.00     0     0
16 2014      HOuston  0.00     0     0
17 2015      HOuston  0.00     0     0
18 2016      HOuston  0.00     0     0
19 2017      HOuston  0.00     0     0
20 2018      HOuston  0.00     0     0
21 2014   LosAngeles  0.00     0     0
22 2015   LosAngeles  0.00     0     0
23 2016   LosAngeles  0.00     0     0
24 2017   LosAngeles  0.00     0     0
25 2018   LosAngeles  0.00     0     0
26 2014        Miami  0.00     0     0
27 2015        Miami  0.00     0     0
28 2016        Miami  0.00     0     0
29 2017        Miami  0.00     0     0
30 2018        Miami  0.00     0     0
31 2014      NewYork  0.00     0     0
32 2015      NewYork  0.00     0     0
33 2016      NewYork  0.00     0     0
34 2017      NewYork  0.00     0     0
35 2018      NewYork  0.00     0     0
36 2014 WashingtonDC  0.00     0     0
37 2015 WashingtonDC  0.00     0     0
38 2016 WashingtonDC  0.00     0     0
39 2017 WashingtonDC  0.00     0     0
40 2018 WashingtonDC  0.00     0     0
1 голос
/ 19 марта 2019

Как насчет этого?

library(tidyverse)
df %>%
    mutate_if(is.factor, as.character) %>%
    gather(k, v, -Year, -City) %>%
    distinct(Year, City, k) %>%
    left_join(dfUpdate %>% mutate_if(is.factor, as.character) %>% gather(k, v, -Year, -City)) %>%
    spread(k, v, fill = 0) %>%
    arrange(City, Year)
#   Year         City TestA TestB TestC
#1  2014       Boston     0     0     0
#2  2015       Boston     0     0     0
#3  2016       Boston 12.23   Joe  1000
#4  2017       Boston     0     0     0
#5  2018       Boston     0     0     0
#6  2014      Chicago     0     0     0
#7  2015      Chicago 16.01 Sally  1500
#8  2016      Chicago     0     0     0
#9  2017      Chicago     0     0     0
#10 2018      Chicago     0     0     0
#11 2014       Denver     0     0     0
#12 2015       Denver     0     0     0
#13 2016       Denver     0     0     0
#14 2017       Denver     0     0     0
#15 2018       Denver     0     0     0
#16 2014      HOuston     0     0     0
#17 2015      HOuston     0     0     0
#18 2016      HOuston     0     0     0
#19 2017      HOuston     0     0     0
#20 2018      HOuston     0     0     0
#21 2014   LosAngeles     0     0     0
#22 2015   LosAngeles     0     0     0
#23 2016   LosAngeles     0     0     0
#24 2017   LosAngeles     0     0     0
#25 2018   LosAngeles     0     0     0
#26 2014        Miami     0     0     0
#27 2015        Miami     0     0     0
#28 2016        Miami     0     0     0
#29 2017        Miami     0     0     0
#30 2018        Miami     0     0     0
#31 2014      NewYork     0     0     0
#32 2015      NewYork     0     0     0
#33 2016      NewYork     0     0     0
#34 2017      NewYork     0     0     0
#35 2018      NewYork     0     0     0
#36 2014 WashingtonDC     0     0     0
#37 2015 WashingtonDC     0     0     0
#38 2016 WashingtonDC     0     0     0
#39 2017 WashingtonDC     0     0     0
#40 2018 WashingtonDC     0     0     0
0 голосов
/ 19 марта 2019

Этого можно добиться с помощью пакета dplyr, что делает классы совместимыми со столбцами, а также не устанавливает строки в качестве факторов:

library(dplyr)

cities <- c('Boston', 'Chicago', 'Denver', 'HOuston', 'LosAngeles', 'Miami', 'NewYork', 'WashingtonDC')
years <- as.numeric(2014:2018)
df <- expand.grid(Year=years, City=cities, TestA=0, TestB=0, TestC=0,  stringsAsFactors = F)
df[with(df, order(Year, City)),]

dfUpdate <- data.frame(Year=c(2016, 2015), City=c('Boston', 'Chicago'), 
                   TestA=c(12.23, 16.01), TestB=c('Joe', 'Sally'), TestC=c(1000, 1500), stringsAsFactors = F )

# Check which columns are not compatible you will see that there is an issue with TestB
# class(df$City) == class(dfUpdate$City)
# class(df$Year) == class(dfUpdate$Year)
# class(df$TestA) == class(dfUpdate$TestA)
# class(df$TestB) == class(dfUpdate$TestB)
# class(df$TestC) == class(dfUpdate$TestC)

# Correct incomptible class
df$TestB = as.character(df$TestB)

library(dplyr)
result = anti_join(df, dfUpdate, by=c("Year","City"))

result = merge(result, dfUpdate, all = T)
result = result[order(result$City),]
> result
   Year         City TestA TestB TestC
1  2014       Boston  0.00     0     0
9  2015       Boston  0.00     0     0
17 2016       Boston 12.23   Joe  1000
25 2017       Boston  0.00     0     0
33 2018       Boston  0.00     0     0
2  2014      Chicago  0.00     0     0
10 2015      Chicago 16.01 Sally  1500
18 2016      Chicago  0.00     0     0
26 2017      Chicago  0.00     0     0
34 2018      Chicago  0.00     0     0
3  2014       Denver  0.00     0     0
11 2015       Denver  0.00     0     0
19 2016       Denver  0.00     0     0
27 2017       Denver  0.00     0     0
35 2018       Denver  0.00     0     0
4  2014      HOuston  0.00     0     0
12 2015      HOuston  0.00     0     0
20 2016      HOuston  0.00     0     0
28 2017      HOuston  0.00     0     0
36 2018      HOuston  0.00     0     0
5  2014   LosAngeles  0.00     0     0
13 2015   LosAngeles  0.00     0     0
21 2016   LosAngeles  0.00     0     0
29 2017   LosAngeles  0.00     0     0
37 2018   LosAngeles  0.00     0     0
6  2014        Miami  0.00     0     0
14 2015        Miami  0.00     0     0
22 2016        Miami  0.00     0     0
30 2017        Miami  0.00     0     0
38 2018        Miami  0.00     0     0
7  2014      NewYork  0.00     0     0
15 2015      NewYork  0.00     0     0
23 2016      NewYork  0.00     0     0
31 2017      NewYork  0.00     0     0
39 2018      NewYork  0.00     0     0
8  2014 WashingtonDC  0.00     0     0
16 2015 WashingtonDC  0.00     0     0
24 2016 WashingtonDC  0.00     0     0
32 2017 WashingtonDC  0.00     0     0
40 2018 WashingtonDC  0.00     0     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...