分组值

时间:2017-01-31 21:57:59

标签: r group-by dummy-variable

我们说我有三个栏目,如下:

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个因素同意。

返回组的格式和组的权重显然可能看起来有点不同。

3 个答案:

答案 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