R 通过组合不同列为数据帧创建新键

R 通过组合不同列为数据帧创建新键,r,R,我有一个data.frame,有4列,“id1”、“id2”、“id3”和“name”,其中“id1”、“id2”和“id3”是非常长的字符串 我需要将“id1”、“id2”和“id3”连接在一起以生成新密钥;“id1”+“id2”+“id3”可以重复。换句话说,每个新键都是“id1”+“id2”+“id3”中值的新组合 我希望这把新钥匙简单而简短,如“key1”、“key2”等。类似的东西 set.seed(42) DF <- data.frame(key1=sample(letters

我有一个
data.frame
,有4列,“id1”、“id2”、“id3”和“name”,其中“id1”、“id2”和“id3”是非常长的字符串

我需要将“id1”、“id2”和“id3”连接在一起以生成新密钥;“id1”+“id2”+“id3”可以重复。换句话说,每个新键都是“id1”+“id2”+“id3”中值的新组合

我希望这把新钥匙简单而简短,如“key1”、“key2”等。

类似的东西

set.seed(42)
DF <- data.frame(key1=sample(letters[1:2],10,TRUE),
                 key2=sample(letters[1:2],10,TRUE),
                 key3=sample(letters[1:2],10,TRUE))

DF <- within(DF,{newkey <- interaction(key1,key2,key3,drop=TRUE)
                 levels(newkey) <- paste0("key",seq_along(levels(newkey)))
                 })

#    key1 key2 key3 newkey
# 1     b    a    b   key4
# 2     b    b    a   key2
# 3     a    b    b   key5
# 4     b    a    b   key4
# 5     b    a    a   key1
# 6     b    b    b   key6
# 7     b    b    a   key2
# 8     a    a    b   key3
# 9     b    a    a   key1
# 10    b    b    b   key6
set.seed(42)

DF我建议对此使用“data.table”中的
.GRP
。它也不应该与500k行数据发生冲突:

library(data.table)
as.data.table(DF)[, combined := .GRP, by = names(DF)][]
#     key1 key2 key3 combined
#  1:    b    a    b        1
#  2:    b    b    a        2
#  3:    a    b    b        3
#  4:    b    a    b        1
#  5:    b    a    a        4
#  6:    b    b    b        5
#  7:    b    b    a        2
#  8:    a    a    b        6
#  9:    b    a    a        4
# 10:    b    b    b        5

如果您需要根据已排序的一组其他键对组合键进行排序,请在执行上述步骤之前使用
setkey

但您的“新手大脑”可以无效地将其点画,并显示他尝试过的内容?还有一些输入数据和预期结果……对于那些没有任何解释就投了反对票的人,我认为你对OP的帮助不大。实际上,这是一个很好的问题,但没有很好的表述。+1!也许我会创建更长的键1,键2,。。我的示例中的字符串。当数据大小很小时,它工作得很好。但当我尝试使用500k行的数据帧时,它得到了溢出错误,因为R尝试分配一个长度为1340百万的向量每个id有多少唯一的键值?请给出一个可复制的示例,说明您的数据实际上是什么样子的。你可以找到如何做到这一点。