Эффективный способ заменить значения в кадре данных извлеченным содержимым из объекта? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть такой фрейм данных:

Hours                 work_place         overtime   
More than 48 hours    Farm          Overtime paid                 
Less than 48 horas    Factory       Overtime paid 
More than 48 hours    Office        Overtime paid                
Less than 48 horas    Farm          Overtime not paid 
More than 48 hours    Factory       Overtime paid                
Less than 48 horas    Office        Overtime paid

В отдельном процессе я создаю несколько объектов.процесс $ object1 выглядит следующим образом:

процесс $ object1

                        Dim1   Dim2   Dim3
 More than 48 hours       0.05  0.33  0.96
 Less than 48 horas      -0.02 -0.16 -0.47
 Farm                     0.14  1.51  0.29
 Factory                 -0.13  0.15  1.03
 Office                   0.01  2.05 -0.47
 Home                     0.00 -0.19 -0.14
 Overtime paid            0.03  0.04 -0.09
 Overtime not paid       -0.26 -0.32  0.76

Я хотел бы заменить значения в исходном кадре данных значениями в столбце 1 (Dim1) процесса $ object1так что в итоге я получаю это ...

  Hours2    work_place2  overtime2   
  0.05     0.14          0.03                 
 -0.02     -0.13         0.03
  0.05     0.01          0.03                
 -0.02     0.14         -0.26 
  0.05     -0.13         0.03                
 -0.02    0.01          0.03

Поскольку исходный фрейм данных довольно большой, я хотел бы сделать это с помощью некоторой функции в R. Любая помощь очень ценится.

Данные в формате dput().

dat <-
structure(list(Hours = c("More than 48 hours", "Less than 48 horas", 
"More than 48 hours", "Less than 48 horas", "More than 48 hours", 
"Less than 48 horas"), work_place = c("Farm", "Factory", "Office", 
"Farm", "Factory", "Office"), overtime = c("Overtime paid", "Overtime paid", 
"Overtime paid", "Overtime not paid", "Overtime paid", "Overtime paid"
)), row.names = c(NA, -6L), class = "data.frame")

process <-
list(object1 = structure(list(Dim1 = c(0.05, -0.02, 0.14, -0.13, 
0.01, 0, 0.03, -0.26), Dim2 = c(0.33, -0.16, 1.51, 0.15, 2.05, 
-0.19, 0.04, -0.32), Dim3 = c(0.96, -0.47, 0.29, 1.03, -0.47, 
-0.14, -0.09, 0.76)), class = "data.frame", row.names = c("More than 48 hours", 
"Less than 48 horas", "Farm", "Factory", "Office", "Home", "Overtime paid", 
"Overtime not paid")))

result <-
structure(list(Hours2 = c(0.05, -0.02, 0.05, -0.02, 0.05, -0.02
), work_place2 = c(0.14, -0.13, 0.01, 0.14, -0.13, 0.01), overtime2 = c(0.03, 
0.03, 0.03, -0.26, 0.03, 0.03)), class = "data.frame", row.names = c(NA, 
-6L))

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Следующее будет делать то, что вы хотите.Обратите внимание, что имя первого столбца результата - Hours, а не Hours2.

fun <- function(x, DF, col){
    rn <- row.names(DF)
    inx <- match(x, rn)
    DF[inx, col]
}

res <- lapply(dat, fun, process$object1, 1)
res <- do.call(cbind.data.frame, res)
res
#  Hours work_place overtime
#1  0.05       0.14     0.03
#2 -0.02      -0.13     0.03
#3  0.05       0.01     0.03
#4 -0.02       0.14    -0.26
#5  0.05      -0.13     0.03
#6 -0.02       0.01     0.03

. Вышеприведенная функция может быть однострочной:

fun <- function(x, DF, col) DF[match(x, row.names(DF)), col]

Но янайти многострочную версию более читабельной.

0 голосов
/ 31 мая 2018
dat[c("Hours2", "work_place2", "overtime2")] <- lapply(
  X   = dat[c("Hours", "work_place", "overtime")],
  FUN = function(x) process[["object1"]][x, "Dim1"]
)

Поскольку data.frame - это просто модный список, вы можете назначить новые значения с новым списком векторов.Поскольку process$object1 имеет имена, вы можете использовать именованное подмножество внутри lapply, чтобы сделать это.

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