我有一个包含3列的数据框:ID号,类别和品牌:
X1 X2 X3
1234 Accessories A89
1234 Accessories A87
1234 Accessories A87
1234 Sides A32
1234 Sides A27
1234 Sides A27
1235 Tops A12
1235 Tops A14
1235 Tops A14
1236 Sides A32
1236 Sides A27
我有150个不同的类别和1700个不同的品牌。
我想找到最常聚集的每个类别的两个品牌:
X2 X1
Accessories A89, A87
Sides A32, A27
Tops A12, A14
或:
#$Accessories
#[1] "A89" "A87"
#$Sides
#[1] "A32" "A27"
#$Tops
#[1] "A12" "A14"
我能想到的唯一方法是将数据框重做如下:
A89 A87 A32 A27 A12 A14
1 1 2 1 2 0 0
2 0 0 0 0 1 2
3 0 0 1 1 0 0
然后在使用大于0的值填充某个列时,返回填充了大于0的值的列。
list1 =(setNames(object = lapply(1:NCOL(df), function(i)
unique(colnames(df)[-i][which(as.matrix(df[which(df[,i] > 0), -i])>0,
arr.ind = TRUE)[,2]])),
nm = colnames(df)))
然后我牺牲了我需要的类别。 关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
,按'X2','X3'分组,我们获取行数(.N
),然后按'X2'分组order
已转换为'X3'和'N',我们得到'{1}}值为'X3',factor
为前两个元素。
unique
paste