一个在 R 中热编码数据帧
One hot coding a data-frame in R
考虑一个数据框df1
类似于显示的
ID EDUCATION OCCUPATION BINARY_VAR
1 Undergrad Student 1
2 Grad Business Owner 1
3 Undergrad Unemployed 0
4 PhD Other 1
您可以使用下面的 R 代码创建您自己的随机 df1
ID <- c(1:4)
EDUCATION <- sample (c('Undergrad', 'Grad', 'PhD'), 4, rep = TRUE)
OCCUPATION <- sample (c('Student', 'Business Owner', 'Unemployed', 'Other'), 4, rep = FALSE)
BINARY_VAR <- sample(c(0, 1), 4, rep = TRUE)
df1 <- data.frame(ID, EDUCATION, OCCUPATION, BINARY_VAR)
# Convert to factor
df1[, names(df1)] <- lapply(df1[, names(df1)] , factor)
据此,我需要导出另一个数据框 df2
,看起来像这样
ID Undergrad Grad PhD Student Business Owner Unemployed Other BINARY_VAR
1 1 0 0 1 0 0 0 1
2 1 1 0 0 1 0 0 1
3 1 0 0 0 0 1 0 0
4 1 1 1 0 0 0 1 1
您一定已经注意到 PhD
水平,EDUCATION
下的其他因素水平也适用,因为 EDUCATION
是 ID
的最高教育水平。然而,这是次要的 objective.
我似乎无法找到一种方法获取数据框,其中每一列都给出与其父数据框中的各个因子水平相对应的真值。 R 中是否有一个包 可以提供帮助?或者可能是一种编码方式?
我可以使用 melt
执行此操作吗?
我通读 previously asked question(s) 看起来 相似,但它们处理的是出现频率。
编辑:
根据 Sumedh 的建议,一种方法是使用 caret
中的 dummyVars
。
dummies <- dummyVars(ID ~ ., data = df1)
df2 <- data.frame(predict(dummies, newdata = df1))
df2 <- df2 [1:7]
tidyr
和 dplyr
结合 base table()
函数应该可以工作:
ID <- c(1:4)
EDUCATION <- c('Undergrad', 'Grad', 'PhD', 'Undergrad')
OCCUPATION <- c('Student', 'Business Owner', 'Unemployed', 'Other')
BINARY_VAR <- sample(c(0, 1), 4, rep = TRUE)
df1 <- data.frame(ID, EDUCATION, OCCUPATION, BINARY_VAR)
# Convert to factor
df1[, names(df1)] <- lapply(df1[, names(df1)] , factor)
library(dplyr)
library(tidyr)
edu<-as.data.frame(table(df1[,1:2])) %>% spread(EDUCATION, Freq)
for(i in 1:nrow(edu))
if(edu[i,]$PhD == 1)
edu[i,]$Undergrad <-edu[i,]$Grad <-1
truth_table<-merge(edu,
as.data.frame(table(df1[,c(1,3)])) %>% spread(OCCUPATION, Freq),
by = "ID")
truth_table$BINARY_VAR<-df1$BINARY_VAR
truth_table
ID Grad PhD Undergrad Business Owner Other Student Unemployed BINARY_VAR
1 0 0 1 0 0 1 0 1
2 1 0 0 1 0 0 0 1
3 1 1 1 0 0 0 1 0
4 0 0 1 0 1 0 0 1
编辑:添加了一个 for
循环以更新低于 PhD
的教育水平,灵感来自 @Sumedh 之前的建议。
考虑一个数据框df1
类似于显示的
ID EDUCATION OCCUPATION BINARY_VAR
1 Undergrad Student 1
2 Grad Business Owner 1
3 Undergrad Unemployed 0
4 PhD Other 1
您可以使用下面的 R 代码创建您自己的随机 df1
ID <- c(1:4)
EDUCATION <- sample (c('Undergrad', 'Grad', 'PhD'), 4, rep = TRUE)
OCCUPATION <- sample (c('Student', 'Business Owner', 'Unemployed', 'Other'), 4, rep = FALSE)
BINARY_VAR <- sample(c(0, 1), 4, rep = TRUE)
df1 <- data.frame(ID, EDUCATION, OCCUPATION, BINARY_VAR)
# Convert to factor
df1[, names(df1)] <- lapply(df1[, names(df1)] , factor)
据此,我需要导出另一个数据框 df2
,看起来像这样
ID Undergrad Grad PhD Student Business Owner Unemployed Other BINARY_VAR
1 1 0 0 1 0 0 0 1
2 1 1 0 0 1 0 0 1
3 1 0 0 0 0 1 0 0
4 1 1 1 0 0 0 1 1
您一定已经注意到 PhD
水平,EDUCATION
下的其他因素水平也适用,因为 EDUCATION
是 ID
的最高教育水平。然而,这是次要的 objective.
我似乎无法找到一种方法获取数据框,其中每一列都给出与其父数据框中的各个因子水平相对应的真值。 R 中是否有一个包 可以提供帮助?或者可能是一种编码方式?
我可以使用 melt
执行此操作吗?
我通读 previously asked question(s) 看起来 相似,但它们处理的是出现频率。
编辑:
根据 Sumedh 的建议,一种方法是使用 caret
中的 dummyVars
。
dummies <- dummyVars(ID ~ ., data = df1)
df2 <- data.frame(predict(dummies, newdata = df1))
df2 <- df2 [1:7]
tidyr
和 dplyr
结合 base table()
函数应该可以工作:
ID <- c(1:4)
EDUCATION <- c('Undergrad', 'Grad', 'PhD', 'Undergrad')
OCCUPATION <- c('Student', 'Business Owner', 'Unemployed', 'Other')
BINARY_VAR <- sample(c(0, 1), 4, rep = TRUE)
df1 <- data.frame(ID, EDUCATION, OCCUPATION, BINARY_VAR)
# Convert to factor
df1[, names(df1)] <- lapply(df1[, names(df1)] , factor)
library(dplyr)
library(tidyr)
edu<-as.data.frame(table(df1[,1:2])) %>% spread(EDUCATION, Freq)
for(i in 1:nrow(edu))
if(edu[i,]$PhD == 1)
edu[i,]$Undergrad <-edu[i,]$Grad <-1
truth_table<-merge(edu,
as.data.frame(table(df1[,c(1,3)])) %>% spread(OCCUPATION, Freq),
by = "ID")
truth_table$BINARY_VAR<-df1$BINARY_VAR
truth_table
ID Grad PhD Undergrad Business Owner Other Student Unemployed BINARY_VAR
1 0 0 1 0 0 1 0 1
2 1 0 0 1 0 0 0 1
3 1 1 1 0 0 0 1 0
4 0 0 1 0 1 0 0 1
编辑:添加了一个 for
循环以更新低于 PhD
的教育水平,灵感来自 @Sumedh 之前的建议。