Mam dwie ramki danych

> x
               tags freq.Freq
1            #solar         1
2      #solarpanels         2
3             #wind         3
4    #ClimateChange         4
5           #energy         5
6  #renewableenergy         6
7         #windfarm         7
8           #Suncor         8
9            #Solar         9
10        #WindTree        10
11       #renewable        11
12      #climatecri        12
13      #renewables        13

I

> y
               tags freq.Freq
1        #renewable       740
2    #ClimateChange       722
3             #wind       638
4           #energy       541
5         #WindTree       525
6       #climatecri       518
7            #solar       359
8  #renewableenergy       326
9            #Solar       296
10      #renewables       245
11     #solarpanels      1029
12        #windfarm       291
13          #Suncor       282

Kolumna y$freq.Freq jest błędna. Chciałbym skopiować odpowiednie wartości dla tej kolumny zgodnie z pozycjami w x. Na przykład. #renewable w x ma x$freq.Freq równa się 11, #ClimateChange ma x$freq.Freq równa się 4 i tak dalej. Wtedy druga dataframe powinna być:

> y
               tags freq.Freq
1        #renewable       11
2    #ClimateChange       4
3             #wind       3
4           #energy       5
5         #WindTree       10
6       #climatecri       12
7            #solar       1
8  #renewableenergy       6
9            #Solar       9
10      #renewables       13
11     #solarpanels       2
12        #windfarm       7
13          #Suncor       8

Jak mogę uzyskać prawidłowe wyrażenie y? Próbowałem z x[order(y$tags),], ale nie otrzymałem odpowiedniego wyniku.

1
Mark 8 marzec 2020, 00:55

2 odpowiedzi

Najlepsza odpowiedź

Możemy użyć match, aby dopasować kolumnę "Tagi" w obu zestawach danych i uzyskać odpowiednią wartość "Freq.freq" z zestawu danych "X"

x$freq.Freq[match(y$tags, x$tags)]
#[1] 11  4  3  5 10 12  1  6  9 13  2  7  8

Lub inna opcja jest factor

as.integer(factor(y$tags, levels = x$tags))
#[1] 11  4  3  5 10 12  1  6  9 13  2  7  8

Lub z mutate

library(dplyr)
y %>% 
    mutate(freq.Freq = match(tags, x$tags))

Dane

x <- structure(list(tags = c("solar", "solarpanels", "wind", "ClimateChange", 
"energy", "renewableenergy", "windfarm", "Suncor", "Solar", "WindTree", 
"renewable", "climatecri", "renewables"), freq.Freq = 1:13), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"
))

y <- structure(list(tags = c("renewable", "ClimateChange", "wind", 
"energy", "WindTree", "climatecri", "solar", "renewableenergy", 
"Solar", "renewables", "solarpanels", "windfarm", "Suncor"), 
    freq.Freq = c(740L, 722L, 638L, 541L, 525L, 518L, 359L, 326L, 
    296L, 245L, 1029L, 291L, 282L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"
))
2
akrun 7 marzec 2020, 22:14

Możemy użyć join, aby połączyć dwa zestawy danych, a następnie select wymagane kolumny

library(dplyr)
inner_join(y, x, by = 'tags') %>% select(tags, freq.Freq.y)

#              tags freq.Freq.y
#1        renewable          11
#2    ClimateChange           4
#3             wind           3
#4           energy           5
#5         WindTree          10
#6       climatecri          12
#7            solar           1
#8  renewableenergy           6
#9            Solar           9
#10      renewables          13
#11     solarpanels           2
#12        windfarm           7
#13          Suncor           8

W bazie r możemy użyć merge

merge(y, x, by = 'tags')
1
Ronak Shah 8 marzec 2020, 02:01