r - 将多个二进制列转换为单个分类列

标签 r categorical-data dummy-data

<分区>

我有一个充满二进制变量的表,我想将其压缩为分类变量。

非常简单,我有一个像这样的数据框:

data <- data.frame(id=c(1,2,3,4,5,6,7,8,9), red=c("1","0","0","0","1","0","0","0","0"),blue=c("0","1","1","1","0","1","1","1","0"),yellow=c("0","0","0","0","0","0","0","0","1"))
data
  id   red   blue  yellow
1  1   1    0      0
2  2   0    1      0
3  3   0    1      0
4  4   0    1      0
5  5   1    0      0
6  6   0    1      0
7  7   0    1      0
8  8   0    1      0
9  9   0    0      1

我想得到的是:

  id   color 
1  1   red    
2  2   blue   
3  3   blue    
4  4   blue    
5  5   red    
6  6   blue    
7  7   blue    
8  8   blue    
9  9   yellow 

我希望对此有一个非常简单的答案。

最佳答案

您可以通过使用列 namesas.logical 来获取值。但是,由于您的“二进制”列是因素,因此您需要多做一些事情:

> apply(data[-1], 1, function(x) names(x)[as.logical(as.numeric(as.character(x)))])
[1] "red"    "blue"   "blue"   "blue"   "red"    "blue"   "blue"   "blue"   "yellow"

将其与第一列 (data[1]) 绑定(bind)以获得所需的输出。

cbind(data[1], 
      color = apply(data[-1], 1, 
                    function(x) names(x)[as.logical(as.numeric(
                      as.character(x)))]))
#   id  color
# 1  1    red
# 2  2   blue
# 3  3   blue
# 4  4   blue
# 5  5    red
# 6  6   blue
# 7  7   blue
# 8  8   blue
# 9  9 yellow

或者,您可以尝试以下操作:

data[-1] <- lapply(data[-1], function(x) as.numeric(as.character(x)))
temp <- subset(cbind(data[1], stack(data[-1])), values == 1, c("id", "ind"))
temp[order(temp$id), ]

或者,您可以组合使用“dplyr”和“tidyr”,如下所示:

library(dplyr)
library(tidyr)

data %>%
  group_by(id) %>%
  mutate_each(funs(an = as.numeric(as.character(.)))) %>%
  gather(color, val, -id) %>%
  filter(val == 1) %>%
  select(-val) %>%
  arrange(id)
# Source: local data frame [9 x 2]
# 
#   id  color
# 1  1    red
# 2  2   blue
# 3  3   blue
# 4  4   blue
# 5  5    red
# 6  6   blue
# 7  7   blue
# 8  8   blue
# 9  9 yellow

关于r - 将多个二进制列转换为单个分类列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29227111/

相关文章:

r - Shiny :动态更改选项卡名称

r - Pivot Longer 将值分布到多个列中

python - 如何一次对数据中的所有列进行分类? (使所有值变为高、中、低)

r - 格式化历史数据以使用日历变量进行预测

r - 带有四分之一虚拟变量的线性回归

R-生成一个 "missing values variable"

python - Python statsmodels OLS 和 R 的 lm 的区别

r - 比较数组行

mysql - 查询中存在冗余数据

r - 来回到 R 中的虚拟变量