gpt4 book ai didi

r - 有效的折叠虚拟变量

转载 作者:行者123 更新时间:2023-12-04 18:37:18 25 4
gpt4 key购买 nike

将虚拟变量折叠回一个因子的有效方法是什么(欢迎任何解决方案,包括非基础包)。

   race.White race.Hispanic race.Black race.Asian
1 1 0 0 0
2 0 0 0 1
3 1 0 0 0
4 0 0 1 0
5 0 0 0 1
6 0 1 0 0
7 1 0 0 0
8 1 0 0 0
9 1 0 0 0
10 0 0 1 0

期望的输出:
       race
1 White
2 Asian
3 White
4 Black
5 Asian
6 Hispanic
7 White
8 White
9 White
10 Black

数据:
dat <- structure(list(race.White = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 
1L, 0L), race.Hispanic = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L,
0L), race.Black = c(0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L),
race.Asian = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("race.White",
"race.Hispanic", "race.Black", "race.Asian"), row.names = c(NA,
-10L), class = "data.frame")

我试过的:

这是一个可能的解决方案,但我相信有更好的 indexing/dplyr/data.table/.etc 解决方案。
apply(dat, 1, function(x) sub("[^.]+\\.", "", colnames(dat))[x])

最佳答案

我们可以使用 max.col要获取列索引,根据该索引对列名进行子集化并使用 sub删除前缀。

sub('[^.]+\\.', '', names(dat)[max.col(dat)])
#[1] "White" "Asian" "White" "Black" "Asian" "Hispanic"
#[7] "White" "White" "White" "Black"

在这里,我假设只有一个 1每行。如果有多个 1,我们可以使用选项 ties.method='first'ties.method='last' .

或者另一种选择是做 %*%使用列序列,对列名进行子集化,并使用 sub 删除前缀.
 sub('[^.]+\\.', '', names(dat)[(as.matrix(dat) %*%seq_along(dat))[,1]])

或者我们可以使用 pmax
sub('[^.]+\\.', '', names(dat)[do.call(pmax,dat*seq_along(dat)[col(dat)])])

关于r - 有效的折叠虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com