применить и какая функция требует ошибки оператора - PullRequest
2 голосов
/ 06 июня 2019

У меня есть справочная таблица:

ref <- data.frame("Strong"=c("A","A","B","B","C","C","D"),
              "Medium"=c("A","B","B","C","C","D","D"),
              "Moderate"=c("B","C","C","C","D","D","D"),
              "Weak"=c("C","C","D","D","D","D","D"))
rownames(ref) <- c("WS1","WS2","WS3","WS4","WS5","WS6","WS7")

И большое dataframe (образец здесь и далее):

df <- data.frame("Rad"=c("Weak","Weak","Weak","Moderate","Moderate"), "Wind"=c("WS4","WS3","WS3","WS2","WS4"))

Мне нужно посмотреть Wind иRad значения от df в моей справочной таблице ref.Для этого я использую следующий код для извлечения индекса, а затем использую эти значения индекса для копирования значения из ref:

df$x <- apply(df,1,function(x){which(colnames(ref) == df[x,"Rad"])})
df$x <- apply(df,1,function(x){which(colnames(ref) == x$Rad)})

df$y <- apply(df,1,function(x){which(rownames(ref) == df[x,"Wind"])})
df$y <- apply(df,1,function(x){which(rownames(ref) == x$Wind)})

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

   Rad     Wind  PG
 1 Weak     WS4  D
 2 Weak     WS3  D
 3 Weak     WS3  D
 4 Moderate WS2  C
 5 Moderate WS4  C

Приведенный выше код работает, но есть проблемы:

  • Мне не нужно было бы писать строки «дважды», но код не запустится, если я запусту только 2-йone.
  • Первая строка не делает того, что ожидала (и не должна делать, так как синтаксис неверен), но, опять же, вторая строка не будет работать, если я не использую «fail»один первый
  • Наконец, хотя это работает, я уверен, что есть другие, более простые способы сделать то, что я делаю.Любая подсказка будет оценена!

Ответы [ 3 ]

2 голосов
/ 06 июня 2019

Другой подход, использующий data.table. Должен быстро бегать даже на больших наборах данных. Использует ту же логику, что и решение @IceCreamToucan, но остается в пределах data.table.

объяснил: использует расплавленную ref -таблицу, чтобы выполнить обновление соединения на df.

library( data.table )

setDT(df)[ melt( setDT( ref, keep.rownames = TRUE ), id.vars = "rn" ), 
           PG := i.value, 
           on = .( Wind == rn, Rad == variable )][]

#         Rad Wind PG
# 1:     Weak  WS4  D
# 2:     Weak  WS3  D
# 3:     Weak  WS3  D
# 4: Moderate  WS2  C
# 5: Moderate  WS4  C
1 голос
/ 06 июня 2019
library(tidyverse)
library(data.table) # for melt

ref_long <- 
  ref %>% 
    rownames_to_column('row') %>% 
    melt('row')

df %>% 
  left_join(ref_long, by = c('Rad' = 'variable', 'Wind' = 'row'))

#        Rad Wind value
# 1     Weak  WS4     D
# 2     Weak  WS3     D
# 3     Weak  WS3     D
# 4 Moderate  WS2     C
# 5 Moderate  WS4     C
1 голос
/ 06 июня 2019

Мы можем match rownames и colnames из ref со столбцами RAD и WIND соответственно и подмножеством из ref.

df$PG <- ref[cbind(match(df$Wind, rownames(ref)), match(df$Rad, colnames(ref)))]
df

#       Rad Wind PG
#1     Weak  WS4  D
#2     Weak  WS3  D
#3     Weak  WS3  D
#4 Moderate  WS2  C
#5 Moderate  WS4  C
...