मेरे पास निम्नलिखित आर डेटाफ्रेम है:
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
आपका बहुत बहुत धन्यवाद।
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))
आर में ऐसा करने के कई तरीके हैं। यह इस बात पर निर्भर करता है कि आप किस पैकेज का उपयोग कर रहे हैं। अधिकांश मॉडलिंग पैकेज जैसे 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
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")
)