【问题标题】:R - convert single column into multiple columns of ones and zeros [duplicate]R - 将单列转换为多列一和零[重复]
【发布时间】:2016-01-15 04:12:21
【问题描述】:

我有一个如下所示的数据集:

data_original <- matrix(c("class1","class2","class3","class1","class2","class3","class1","class2","class3"),ncol=1,byrow=TRUE)
colnames(data_original) <- c("class")
rownames(data_original) <- c("student1","student2","student3","student1","student2","student3","student1","student2","student3")
data_original <- as.table(data_original)
data_original

         class 
student1 class1
student2 class2
student3 class3
student1 class1
student2 class2
student3 class3
student1 class1
student2 class2
student3 class3

我希望它看起来像这样:

data_req <- matrix(c(1,1,0,1,0,0,1,1,0),ncol=3,byrow=TRUE)
colnames(data_req) <- c("class1","class2","class3")
rownames(data_req) <- c("student1","student2","student3")
data_req <- as.table(data_req)
data_req

        class1 class2 class3
student1      1      1      0
student2      1      0      0
student3      1      1      0

基本上,我想将指示学生正在学习的班级的班级列中的值转换为自己的列。 有没有可以做到这一点的 R 包?

【问题讨论】:

  • 您的输出与您的输入不匹配。
  • 您的输入实际上是table,还是data.frame?
  • 看来要转换的原始数据不正确。似乎学生和班级应该按“1,2,3”和“1,1,1”的顺序排列,其中上面的数据是“1,2,3”和“1,2,3”
  • 对不起,是的,输出不匹配,我想提供一个我想要的输出类型的例子。我想不出桌子的名字。 @thelatemail - 是的,我的看起来像重复的。我想不出要搜索的名称,我猜二进制表是个好名字。

标签: r


【解决方案1】:

鉴于所需的输出,似乎输入应该如下(作为数据框)

data_original <- structure(list(student = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L), .Label = c("student1", "student2", "student3"), class = "factor"), 
    class = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("class1", 
    "class2", "class3"), class = "factor"), val = c(1, 1, 1, 
    1, 0, 1, 0, 0, 0)), .Names = c("student", "class", "val"), row.names = c(NA, 
-9L), class = "data.frame")

以更易读的形式

   student  class val
1 student1 class1   1
2 student2 class1   1
3 student3 class1   1
4 student1 class2   1
5 student2 class2   0
6 student3 class2   1
7 student1 class3   0
8 student2 class3   0
9 student3 class3   0

tidyr 解决方案如下

library(dplyr)
library(tidyr)

data_original %>% spread(class, val)

【讨论】:

    【解决方案2】:

    如果您可以将数据转换为数据框,我认为它会更容易。

    df <- data.frame(student=rownames(data_original), class=data_original[,1])
    

    那么你就可以使用

    library(reshape2)
    dcast(unique(df), student ~ class, length, value.var="class")
    

    【讨论】:

    • recast(data_original, student ~ value, id.var = "student")
    【解决方案3】:

    我们可以使用xtabs

    xtabs(val~student+class, data_original)
    #             class
    #student    class1 class2 class3
    #  student1      1      1      0
    #  student2      1      0      0
    #  student3      1      1      0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2019-03-01
      • 2017-08-02
      • 1970-01-01
      • 2022-01-02
      • 2019-02-17
      相关资源
      最近更新 更多