R: "Binning" 分类变量
R: "Binning" categorical variables
我有一个 data.frame
,它有 13 个带因子的列。其中一列包含信用评级数据并具有 54 个不同的值:
levels(TR_factor$crclscod)
[1] "A" "A2" "AA" "B" "B2" "BA" "C" "C2" "C5" "CA" "CC" "CY" "D"
[14] "D2" "D4" "D5" "DA" "E" "E2" "E4" "EA" "EC" "EF" "EM" "G" "GA"
[27] "GY" "H" "I" "IF" "J" "JF" "K" "L" "M" "O" "P1" "TP" "U"
[40] "U1" "V" "V1" "W" "Y" "Z" "Z1" "Z2" "Z4" "Z5" "ZA" "ZY"
我想要的是 "bin" 那些类别变成
levels(TR_factor$crclscod)
[1] "all A" "all B" "all C" "all D" [...] "all z"
我的尝试是使用某种形式的构造,例如
crcls_reduced <- ifelse(TR_factor$crclscod %in% c("A","A2", "AA", "B", "B2","BA", "C" , "C2" ,"C5" ,"CA" ,"CC", "CY", "D", "D2", "D4", "D5" ,"DA", "E" , "E2", "E4" ,"EA", "EC" ,"EF", "EM", "G" , "GA", "GY" ,"H", "I", "IF" ,"J" , "JF" ,"K", "L", "M", "O", "P1","TP", "U", "U1" ,"V", "V1", "W" , "Y" , "Z" , "Z1", "Z2", "Z4" ,"Z5", "ZA", "ZY"), "A", "B", "C", "D", "E", "G", "H", "I", "J", "K", "L", "M", "O", "P", "T", "U", "V", "W", "Y", "Z")
当然,这个构造只能产生二进制输出。当然,我可以为每个字母手动完成所有操作,但我希望 Whosebug 知道一种更快、更有效的方法——例如使用一些我不知道的包。
你可以试试
factor(paste('all', sub('(.).*$', '\1', v1)))
或者
factor(paste('all', substr(v1, 1,1)))
数据
v1 <- c("A", "A2", "AA", "B", "B2", "BA", "C", "C2", "C5", "CA", "CC",
"CY", "D", "D2", "D4", "D5", "DA", "E", "E2", "E4", "EA", "EC",
"EF", "EM", "G", "GA", "GY", "H", "I", "IF", "J", "JF", "K",
"L", "M", "O", "P1", "TP", "U", "U1", "V", "V1", "W", "Y", "Z",
"Z1", "Z2", "Z4", "Z5", "ZA", "ZY")
这似乎与@akrun 的回答相似,并且还使用了第一个字母是所需新级别的事实:
myf <- as.factor(paste(LETTERS, 1:100, sep=''))
myf_binned <- myf
levels(myf_binned) <- sapply(levels(myf_binned),
function(l) substring(l, 1, 1))
myf_binned
然后您可以通过
查看 'bin' 会员资格
table(as.character(myf_binned))
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3
编辑:
实际上,substring
接受向量,所以它可以更简单
levels(myf_binned) <- substring(levels(myf_binned), 1, 1)
我有一个 data.frame
,它有 13 个带因子的列。其中一列包含信用评级数据并具有 54 个不同的值:
levels(TR_factor$crclscod)
[1] "A" "A2" "AA" "B" "B2" "BA" "C" "C2" "C5" "CA" "CC" "CY" "D"
[14] "D2" "D4" "D5" "DA" "E" "E2" "E4" "EA" "EC" "EF" "EM" "G" "GA"
[27] "GY" "H" "I" "IF" "J" "JF" "K" "L" "M" "O" "P1" "TP" "U"
[40] "U1" "V" "V1" "W" "Y" "Z" "Z1" "Z2" "Z4" "Z5" "ZA" "ZY"
我想要的是 "bin" 那些类别变成
levels(TR_factor$crclscod)
[1] "all A" "all B" "all C" "all D" [...] "all z"
我的尝试是使用某种形式的构造,例如
crcls_reduced <- ifelse(TR_factor$crclscod %in% c("A","A2", "AA", "B", "B2","BA", "C" , "C2" ,"C5" ,"CA" ,"CC", "CY", "D", "D2", "D4", "D5" ,"DA", "E" , "E2", "E4" ,"EA", "EC" ,"EF", "EM", "G" , "GA", "GY" ,"H", "I", "IF" ,"J" , "JF" ,"K", "L", "M", "O", "P1","TP", "U", "U1" ,"V", "V1", "W" , "Y" , "Z" , "Z1", "Z2", "Z4" ,"Z5", "ZA", "ZY"), "A", "B", "C", "D", "E", "G", "H", "I", "J", "K", "L", "M", "O", "P", "T", "U", "V", "W", "Y", "Z")
当然,这个构造只能产生二进制输出。当然,我可以为每个字母手动完成所有操作,但我希望 Whosebug 知道一种更快、更有效的方法——例如使用一些我不知道的包。
你可以试试
factor(paste('all', sub('(.).*$', '\1', v1)))
或者
factor(paste('all', substr(v1, 1,1)))
数据
v1 <- c("A", "A2", "AA", "B", "B2", "BA", "C", "C2", "C5", "CA", "CC",
"CY", "D", "D2", "D4", "D5", "DA", "E", "E2", "E4", "EA", "EC",
"EF", "EM", "G", "GA", "GY", "H", "I", "IF", "J", "JF", "K",
"L", "M", "O", "P1", "TP", "U", "U1", "V", "V1", "W", "Y", "Z",
"Z1", "Z2", "Z4", "Z5", "ZA", "ZY")
这似乎与@akrun 的回答相似,并且还使用了第一个字母是所需新级别的事实:
myf <- as.factor(paste(LETTERS, 1:100, sep=''))
myf_binned <- myf
levels(myf_binned) <- sapply(levels(myf_binned),
function(l) substring(l, 1, 1))
myf_binned
然后您可以通过
查看 'bin' 会员资格table(as.character(myf_binned))
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3
编辑:
实际上,substring
接受向量,所以它可以更简单
levels(myf_binned) <- substring(levels(myf_binned), 1, 1)