我们说我有三个栏目,如下:
c1 c2 c3
red one low
blue two high
red two low
red one low
我试图想出一种有效的方法来创建按相似性编码记录的新列。结果如下:
c1 c2 c3 d1
red one low 1
blue two high
red two low
red one low 1
通过这个通用示例,我可以改变所包含的列数,以确定哪些列的子集在记录之间是相似的。我的猜测是,这可能涉及k模式聚类算法,虽然我还没有弄清楚如何获得如上所述的输出,当然这可以很容易地用作回归量。
更新
根据目前的建议,交互命令是迄今为止最优雅的(一行!),也是最简约的命令,因为它在一列中以数字方式编码所有组。感谢该建议的电子邮件,并感谢其他所有人的其他方法。
让我更具挑战性,实际上更接近我的需要。以上面的例子为例,我也可以使用部分匹配。如果两列同意怎么办?输出可能看起来像这样
c1 c2 c3 g1 g2
red one low 1 2
blue two high
red two low 2
red one low 1 2
除了群体的权重:
group weight
1 3
2 2
在这个例子中,第1组的权重为3,因为所有因素都是一致的,而第2组的权重为2,因为只有2个因素同意。
返回组的格式和组的权重显然可能看起来有点不同。
答案 0 :(得分:2)
我喜欢rsoren的扩展网格答案,但代码列中的数字比原始数据的行数要多。
如果您想从1开始作为最低的唯一标识符并连续添加数字,则需要稍微调整一下。
这是你的表
original_data <- read.table(
header = TRUE,
text = "
c1 c2 c3
red one low
blue two high
red two low
red one low")
指定要使用的行,例如前两行:
unique_data <- unique(original_data[,1:2])
unique_data$ID <- 1:nrow(unique_data)
最后将表合并:
final_data <- merge(original_data, unique_data)
答案 1 :(得分:1)
这是一种方式。使用每个唯一的变量组合创建一个新的数据框,为每个组合提供一个代码,然后将其合并到原始
read_data
答案 2 :(得分:1)
也许我缺少更多的复杂性,但您可以使用?interaction
来标记匹配的记录:
dat$group <- as.numeric(interaction(dat,drop=TRUE))
# c1 c2 c3 group
#1 red one low 2
#2 blue two high 1
#3 red two low 3
#4 red one low 2