Слияние столбца с фреймом данных двумя разными ключами - PullRequest
0 голосов
/ 08 октября 2018

кадр данных df.freq ниже полон слов и их свойств (например, частота, длина и т. Д.).

 df.freq
 'data.frame':  221324 obs. of  7 variables:
 $ Word         : Factor w/ 221324 levels "a","aa-class",..: 195399 6167 198867 90289 1 131901 91600 95885 195346 95685 ...
 $ BlogFreqPm   : num  48737 28649 27965 23737 23630 ...
 $ TwitterFreqPm: num  30241 14145 25420 29598 19788 ...
 $ NewsFreqPm   : num  56009 25139 25590 5516 25291 ...
 $ CumFreqPm    : num  134987 67932 78975 58851 68709 ...
 $ LogCumFreq   : num  11.8 11.1 11.3 11 11.1 ...
 $ Length       : int  3 3 2 1 1 2 2 2 4 2 ...

Мне нужно merge столбцы LogCumFreq и Length вкадр данных выше с кадром данных df.words ниже.

 df.words
 Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    
 $ target                : chr  "HAT" "DEPART" "MUD" "LUST" ...
 $ prime                 : chr  "hat" "department" "muddy" "luster" ...
 ...

Мне нужно применить merge, чтобы переменные LogCumFreq и Length в df.freq вставлялись для каждой строки в двух разных столбцах, каждый из которыхсодержит значения для prime и target соответственно.

Я пытался сначала использовать merge для prime, а затем target, но, поскольку два значения всегда находятся в одной строке, они перезаписывают друг друга.Кто-нибудь знает, как это сделать?

РЕДАКТИРОВАТЬ: Пример dput кадров данных ниже.

df.words <-

structure(list(prime = structure(c(2L, 1L, 5L, 4L, 3L), .Label = c("department", 
"hat", "hunter", "luster", "muddy"), class = "factor"), target = structure(c(2L, 
1L, 4L, 3L, 5L), .Label = c("DEPART", "HAT", "LUST", "MUD", 
"SPY"), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

df.freq <- 
structure(list(word = structure(c(3L, 2L, 8L, 6L, 4L, 1L, 7L, 
5L, 9L), .Label = c("depart", "department", "hat", "hunter", 
"lust", "luster", "mud", "muddy", "spy"), class = "factor"), 
    freq = c(4.3, 5.323, 9.9, 2, 0.56, 4.5, 6.99, 10.88, 7), 
    length = c(3L, 10L, 5L, 6L, 6L, 6L, 3L, 4L, 3L)), row.names = c(NA, 
-9L), class = "data.frame")

Ниже приведен пример желаемого вывода:

df.words.freq <- 

structure(list(prime = structure(c(2L, 1L, 5L, 4L, 3L), .Label = c("department", 
"hat", "hunter", "luster", "muddy"), class = "factor"), target = structure(c(2L, 
1L, 4L, 3L, 5L), .Label = c("DEPART", "HAT", "LUST", "MUDDY", 
"SPY"), class = "factor"), freq.prime = c(4.3, 5.323, 9.9, 2, 
0.56), freq.target = c(4.3, 4.5, 6.99, 10.88, 7), length.prime = c(3, 
10, 5, 6, 6), length.target = c(3, 6, 3, 4, 3)), row.names = c(NA, 
-5L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вам необходимо выполнить слияние в 2 этапа, а затем переименовать столбцы в соответствии с требованием, используя names() или colnames()

df1 <- merge(df.words, df.freq, by.x = "prime", by.y = "word", all.x = TRUE)
df1$targetword <- tolower(df1$target)   #to match the keywords

df2 <- merge(df1, df.freq, by.x = "targetword", by.y = "word", all.x = TRUE)
df2$targetword <- NULL
0 голосов
/ 08 октября 2018

Это всего лишь два слияния.Большая часть работы здесь заключается в получении нужных имен столбцов:

result = merge(df.words, setNames(df.freq, nm = paste(names(df.freq), "prime", sep = ".")),
      by.x = "prime", by.y = "word.prime")
result$target = tolower(result$target)
result = merge(result, setNames(df.freq, nm = paste(names(df.freq), "target", sep = ".")),
      by.x = "target", by.y = "word.target")
#   target      prime freq.prime length.prime freq.target length.target
# 1 depart department      5.323           10        4.50             6
# 2    hat        hat      4.300            3        4.30             3
# 3   lust     luster      2.000            6       10.88             4
# 4    mud      muddy      9.900            5        6.99             3
# 5    spy     hunter      0.560            6        7.00             3

Вы можете использовать toupper для повторного преобразования target в верхний регистр, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...