R代码 - 重组数据,三列堆叠数据到行

时间:2016-04-28 16:31:32

标签: r reshape reshape2 tidyr

在此示例数据中,三个人将10个项目分类为可变数量的组,并为每个组提供文本标签。 人和标签是文本字段。下载并读入R时的项目var读取为整数。项目变量实际上是分类数据,并定义项目的文本;测试的项目编号是一个很好的类比。标签,物品和人员可以按任何顺序排列,我通常会按照您在此处看到的数据进行排序,以便进行目视检查。在这个例子中,每个人有10个项目,在现实世界中通常有100个项目。每个人都有可变数量的标签。每个标签都有可变数量的项目。所有项目都与一个且仅一个标签相关联,并且所有项目(在此示例中为1-10)对每个人显示一次,没有丢失的数据。

人组项目

person_1 label_A 1

person_1 label_A 2

person_1 label_A 3

person_1 label_A 4

person_1 label_B 5

person_1 label_B 6

person_1 label_C 7

person_1 label_C 8

person_1 label_C 9

person_1 label_C 10

person_2 label_D 1

person_2 label_D 2

person_2 label_D 3

person_2 label_D 4

...为简洁省略了剩余的行

我需要将数据重组为后续格式。每一行都是带有关联项的标签变量,标签位于一行且只有一行。每个人重复多次,因为他们有独特的标签。我已经搜索了堆栈溢出并且已经使用reshape和tidyr进行了多次尝试,我能生成的最好的是矩形二进制矩阵,其中数据框中有一个或零,其中有一列用于person和label,然后是10列标记为1:10对于此示例中的每个项目值。我可以进行后期处理以获得我想要的excel但是宁愿在R中完成所有操作,我需要列中的实际项值,如下所示。理想情况下,最大ncol对于peson&标签和表示排序所需的数量。 Person3,label_H需要7个col作为项目,因此在这些列或其他行中可能有NA或0。 任何帮助都会非常感激,我通常可以在StackOverflow上找到我需要的答案,这次我很难过。

人员群组

person_1 label_A 1 2 3 4
person_1 label_B 5 6
person_1 label_C 7 8 9 10
person_2 label_D 1 2 3 4
person_2 label_E 5 6 7
person_2 label_F 8 9 10
person_3 label_G 1 2 3
person_3 label_H 4 5 6 7 8 9 10

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解这个问题。最终你正在寻找这样的东西:

df <- read.table(header=TRUE, text=
"person group item
person_1 label_A 1
person_1 label_A 2
person_1 label_A 3
person_1 label_A 4
person_1 label_B 5
person_1 label_B 6
person_1 label_C 7
person_1 label_C 8
person_1 label_C 9
person_1 label_C 10
person_2 label_D 1
person_2 label_D 2
person_2 label_D 3
person_2 label_D 4")
df2 <- unique(df[-3])
split(df$item, list(df$person, df$group), drop=TRUE)
df2$L <- split(df$item, list(df$person, df$group), drop=TRUE)
df2

结果:

#> df2
#     person   group           L
#1  person_1 label_A  1, 2, 3, 4
#5  person_1 label_B        5, 6
#7  person_1 label_C 7, 8, 9, 10
#11 person_2 label_D  1, 2, 3, 4