R обновляет нулевые значения во фрейме данных, используя таблицу поиска, используя имена столбцов для поиска - PullRequest
3 голосов
/ 11 июня 2019

Я хотел бы иметь возможность заменить нулевые значения во фрейме данных, используя таблицу поиска значений замены, где значение замены отличается для каждого столбца. Поверьте, что простой пример ниже объясняет проблему и желаемый результат.

# Dummy data frame
A <- seq(0,5,1)
B <- seq(5,0,-1)
C <- c(1,3,0,4,2,5)
dfr<-data.frame(A,B,C)

 A B C
 0 5 1
 1 4 3
 2 3 0
 3 2 4
 4 1 2
 5 0 5

# Lookup table with replacement values
D <- c('A','B','C')
E <- c(0.5,0.04,0.003)
lku <- data.frame(D,E)

D     E
A 0.500
B 0.040
C 0.003

# Desired answer
 A    B    C
 0.50 5.00 1.000
 1.00 4.00 3.000
 2.00 3.00 0.003
 3.00 2.00 4.000
 4.00 1.00 2.000
 5.00 0.04 5.000

Таким образом, если в столбце A при использовании справочной таблицы найден ноль, то ноль заменяется на 0,50, но для столбца B ноль заменяется на 0,04 и т. Д. Я не уверен, с чего начать, кроме как проходить по столбцам один за другим с помощью цикла и указывать на соответствующую строку таблицы поиска?

Обновление

Я попробовал зацикливание, но не смог заставить это работать - объяснение почему бы не помочь.

for(i in 1:3){
  ifelse(dfr[ ,i] == 0, lku[i,2], dfr[ ,i])
}

Ответы [ 3 ]

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

Базовая опция R с использованием Map

dfr[] <- Map(function(x, y) replace(x, x == 0, y), dfr, 
                            lku$E[match(names(dfr), lku$D)])

#    A    B     C
#1 0.5 5.00 1.000
#2 1.0 4.00 3.000
#3 2.0 3.00 0.003
#4 3.0 2.00 4.000
#5 4.0 1.00 2.000
#6 5.0 0.04 5.000
1 голос
/ 11 июня 2019

Опция с base R

lku$E[col(dfr)] * (!dfr) + dfr
#   A    B     C
#1 0.5 5.00 1.000
#2 1.0 4.00 3.000
#3 2.0 3.00 0.003
#4 3.0 2.00 4.000
#5 4.0 1.00 2.000
#6 5.0 0.04 5.000
1 голос
/ 11 июня 2019

Другая base R возможность может быть:

sweep(dfr == 0, 2, t(lku[2]), "*") + dfr

    A    B     C
1 0.5 5.00 1.000
2 1.0 4.00 3.000
3 2.0 3.00 0.003
4 3.0 2.00 4.000
5 4.0 1.00 2.000
6 5.0 0.04 5.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...