【问题标题】:R : How to turn categorical variable into dummies, and collapsing ID variablesR:如何将分类变量变成虚拟变量,并折叠 ID 变量
【发布时间】:2018-01-19 14:57:49
【问题描述】:

我正在研究 R。

我有一个包含 2 列的数据框:一个标识符,其中一些标识符多次出现,以及一个分类变量。

每个标识符可以有多个类别。

我正在尝试将其转换为仅包含虚拟变量而不是分类变量的数据集。这也要求每个标识符变量只有一行,即使有些在原始数据框中多次出现(为了匹配多个类别)。

换句话说,我正在尝试改变这个:

data.frame(ID = c("A", "B", "C", "A", "C", "B"), 
       Color = c("Red", "Blue", "Green", "Blue", "Blue", "Red"))

进入这个:

data.frame(ID = c("A", "B", "C"), 
       Color_Red = c(1, 1, 0), 
       Color_Blue = c(1, 1, 1), 
       Color_Green = c(0, 0, 1))

有什么想法吗?

非常感谢!

【问题讨论】:

标签: r


【解决方案1】:

另一种稍微重塑的解决方案:

df = data.frame(ID = c("A", "B", "C", "A", "C", "B"), 
                Color = c("Red", "Blue", "Green", "Blue", "Blue", "Red"))

library(tidyverse)

df %>%
  mutate(counts = 1) %>%
  spread(Color, counts, fill = 0)

#   ID Blue Green Red
# 1  A    1     0   1
# 2  B    1     0   1
# 3  C    1     1   0

【讨论】:

  • 效果很好,谢谢!当然,我本可以想到 table 也可以 :)
  • 它可以工作,但不会为您提供 data.frame 输出,而是“表”类的对象(即整数值数组)。
【解决方案2】:
with(df,table(ID,Color))
   Color
ID  Blue Green Red
  A    1     0   1
  B    1     0   1
  C    1     1   0

如果你需要结果是一个数据框,你可以重塑

dcast(data.frame(with(df,table(ID,Color))),ID~Color)
  ID Blue Green Red
1  A    1     0   1
2  B    1     0   1
3  C    1     1   0

【讨论】:

    【解决方案3】:

    使用data.table的另一种解决方案:

    library(data.table)
    setDT(df)
    df <- dcast(df, ID ~ Color)
    df[,2:4 := lapply(.SD,function(x){ifelse(is.na(x),0,1)}), .SDcols = 2:4]
    

    结果:

        ID Blue Green Red
    1:  A    1     0   1
    2:  B    1     0   1
    3:  C    1     1   0
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2020-08-02
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多