В R есть способ перекодировать столбцы из одного фрейма данных со значениями из другого фрейма данных? - PullRequest
1 голос
/ 18 апреля 2020

Я все еще относительно новичок в работе в R, и я не уверен, как решить эту проблему. Буду очень признателен за любую помощь или совет !!!

У меня проблема в том, что я работаю с двумя фреймами данных, и мне нужно перекодировать первый фрейм данных со значениями из второго. Первый кадр данных (df1) содержит данные от респондентов для опроса, а другой кадр данных (df2) - это словарь данных для df1.

Данные выглядят следующим образом:

df1 <-  data.frame(a = c(1,2,3), 
            b = c(4,5,6), 
            c = c(7,8,9))

df2 <- data.frame(columnIndicator = c("a","a","a","b","b","b","c","c","c" ),
              df1_value = c(1,2,3,4,5,6,7,8,9),
              new_value = c("a1","a2","a3","b1","b2","b3","c1","c2","c3"))

Пока что я могу вручную перекодировать df1, чтобы получить ожидаемый результат, выполнив это:

df1 <- within(df1,{
  a[a==1] <- "a1"
  a[a==2] <- "a2"
  a[a==3] <- "a3"
  b[b==4] <- "b4"
  b[b==5] <- "b5"
  b[b==6] <- "b6"
  c[c==7] <- "c7"
  c[c==8] <- "c8"
  c[c==9] <- "c9"
})

Однако в моем реальном наборе данных содержится около 42 столбцов, которые необходимо перекодировать, и этот метод требует немного времени. Есть ли другой способ в R для меня перекодировать значения в df1 со значениями в df2?

Спасибо!

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Просто нужно немного преобразовать форму.

library(data.table)
df1 <-  data.frame(a = c(1,2,3), 
                   b = c(4,5,6), 
                   c = c(7,8,9))

df2 <- data.frame(columnIndicator = c("a","a","a","b","b","b","c","c","c" ),
                  df1_value = c(1,2,3,4,5,6,7,8,9),
                  new_value = c("a1","a2","a3","b4","b5","b6","c7","c8","c9"),stringsAsFactors = FALSE)



setDT(df1)
setDT(df2)

df1[,ID:=.I]

ldf1 <- melt(df1,measure.vars = c("a","b","c"),variable.name = "columnIndicator",value.name = "df1_value")


ldf1[df2,"new_value":=i.new_value,on=.(columnIndicator,df1_value)]

ldf1
#>    ID columnIndicator df1_value new_value
#> 1:  1               a         1        a1
#> 2:  2               a         2        a2
#> 3:  3               a         3        a3
#> 4:  1               b         4        b4
#> 5:  2               b         5        b5
#> 6:  3               b         6        b6
#> 7:  1               c         7        c7
#> 8:  2               c         8        c8
#> 9:  3               c         9        c9

dcast(ldf1,ID~columnIndicator,value.var = "new_value")
#>    ID  a  b  c
#> 1:  1 a1 b4 c7
#> 2:  2 a2 b5 c8
#> 3:  3 a3 b6 c9

Создано в 2020-04-18 пакетом Представить (v0.3.0)

1 голос
/ 18 апреля 2020

В базе R мы можем unlist df1 match это с df1_value и получить соответствующее new_value.

df1[] <- df2$new_value[match(unlist(df1), df2$df1_value)]
df1

#   a  b  c
#1 a1 b1 c1
#2 a2 b2 c2
#3 a3 b3 c3
0 голосов
/ 18 апреля 2020

Это то, что вы ищете ???

library(dplyr)
df3 <- df1 %>% gather(key = "key", value = "value")

df3 %>% inner_join(df2, by = c("key" = "columnIndicator", "value" = "df1_value"))

Вывод

  key value new_value
1   a     1        a1
2   a     2        a2
3   a     3        a3
4   b     4        b1
5   b     5        b2
6   b     6        b3
7   c     7        c1
8   c     8        c2
9   c     9        c3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...