मेरे पास निम्नलिखित आर डेटाफ्रेम है:

id    color
001   blue
001   yellow
001   red
002   blue
003   blue
003   yellow

निम्नलिखित में इस तरह के डेटाफ़्रेम को एक-हॉट-एन्कोड करने की सामान्य विधि क्या है:

id    blue    yellow    red
001   1       1         1
002   1       0         0
003   1       0         1

आपका बहुत बहुत धन्यवाद।

0
Louis GRIMALDI 13 अक्टूबर 2020, 18:43

3 जवाब

सबसे बढ़िया उत्तर

ये कोशिश करें। आप एक के बराबर डेटा में मौजूद उन अवलोकनों के लिए एक वैरिएबल बना सकते हैं और फिर मानों को फिर से आकार देने के लिए pivot_wider() का उपयोग कर सकते हैं। जैसा कि आपको डेटा में मौजूद नहीं कक्षाओं के लिए NA मिलेगा, आप replace() का उपयोग करके इसे शून्य से बदल सकते हैं। यहाँ tidyverse फ़ंक्शन का उपयोग करने वाला कोड:

library(dplyr)
library(tidyr)
#Code
dfnew <- df %>% mutate(val=1) %>%
  pivot_wider(names_from = color,values_from=val) %>%
  replace(is.na(.),0)

आउटपुट:

# A tibble: 3 x 4
     id  blue yellow   red
  <int> <dbl>  <dbl> <dbl>
1     1     1      1     1
2     2     1      0     0
3     3     1      1     0

उपयोग किए गए कुछ डेटा:

#Data
df <- structure(list(id = c(1L, 1L, 1L, 2L, 3L, 3L), color = c("blue", 
"yellow", "red", "blue", "blue", "yellow")), class = "data.frame", row.names = c(NA,-6L))
1
Duck 13 अक्टूबर 2020, 19:10

आर में ऐसा करने के कई तरीके हैं। यह इस बात पर निर्भर करता है कि आप किस पैकेज का उपयोग कर रहे हैं। अधिकांश मॉडलिंग पैकेज जैसे caret और tidymodels में आपके लिए ऐसा करने के लिए कार्य हैं।

हालाँकि, यदि आप मॉडलिंग पैकेज का उपयोग नहीं कर रहे हैं तो tidyverse के पास ऐसा करने का एक आसान तरीका है।

library(dplyr)
library(tidyr)

df <- tribble(
  ~id,    ~color,
  '001',   'blue',
  '001',   'yellow',
  '001',   'red',
  '002',   'blue',
  '003',   'blue',
  '003',   'yellow')

df_onehot <- df %>%
  mutate(value = 1) %>%
  pivot_wider(names_from = color,values_from = value,values_fill = 0)
# A tibble: 3 x 4
#    id     blue yellow   red
#   <chr> <dbl>  <dbl> <dbl>
# 1 001       1      1     1
# 2 002       1      0     0
# 3 003       1      1     0
1
Adam Sampson 13 अक्टूबर 2020, 18:51

data.table के साथ:

library(data.table)
dcast(setDT(df), id ~ color, fun.aggregate = length)

#     id blue red yellow
# 1: 001    1   1      1
# 2: 002    1   0      0
# 3: 003    1   0      1

tidyr के साथ एक ही तर्क:

library(tidyr)
pivot_wider(df, names_from=color, values_from=color, values_fn=length, values_fill=0)

#   id     blue yellow   red
#   <chr> <int>  <int> <int>
# 1 001       1      1     1
# 2 002       1      0     0
# 3 003       1      1     0

Base R:

out <- as.data.frame.matrix(pmin(with(df, table(id, color)), 1))
out$id <- rownames(out)
out
#     blue red yellow  id
# 001    1   1      1 001
# 002    1   0      0 002
# 003    1   0      1 003

प्रतिलिपि प्रस्तुत करने योग्य डेटा

df <- data.frame(
  id = c("001", "001", "001", "002", "003", "003"), 
  color = c("blue", "yellow", "red", "blue", "blue", "yellow")
)
1
sindri_baldur 13 अक्टूबर 2020, 18:59