如果我有一个类似下面这样的数据框:
x y
13 a
14 b
15 c
15 c
14 b
我希望每组相等的行都有一个唯一的ID,像这样:
x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2
有没有简单的方法来做到这一点?
谢谢
如果我有一个类似下面这样的数据框:
x y
13 a
14 b
15 c
15 c
14 b
x y id
13 a 1
14 b 2
15 c 3
15 c 3
14 b 2
有没有简单的方法来做到这一点?
谢谢
我对paste0
方法有些担忧。如果你的列包含更复杂的数据,可能会得到令人惊讶的结果。例如:
x y
ab c
a bc
paste(..., sep = "@")
替换paste0(...)
。即便如此,你也无法想出一个通用的sep
,它将适用于任何类型的数据,因为sep
始终有可能包含在某些数据中。base
包,但使用plyr
会更容易一些:library(plyr)
.idx <- 0L
ddply(df, colnames(df), transform, id = (.idx <<- .idx + 1L))
data.table
方法,就像这里提出的那样:data.table "key indices" or "group counter"。paste0
的确是个好方法,不过我添加了一个更好的解决方案,实际上比原来的答案更加简洁。 - Jouni Helskeinteraction
等同于使用paste(..., sep = '.')
; 从理论上讲,它会遇到我所讨论的相同(不太可能的)问题。 - flodelab.c
和a.bc
这两个不同的结果。我想这就是所需的。然而,paste0
不能正常工作(如果不需要分隔符,则可以使用)。 - Jouni Helske我的第一个想法是:
创建一个新变量,通过将两列的值连接为字符串来组合它们:
a<-paste0(z$x,z$y) #z is your data.frame
cbind(z,id=factor(a,labels=1:length(unique(a))))
编辑:@flodel 担心使用 paste0
,最好使用普通的 paste
或交互操作:
a<-interaction(z,drop=TRUE)
cbind(z,id=factor(a,labels=1:length(unique(a))))
假设您想要分离x=ab
、y=c
和x=a
、y=bc
。如果不是,请使用paste0
。
a
替换为do.call(paste0, z)
。将1:length(unique(a))
替换为seq_along(unique(a))
。 - Arunseq_along
,而 do.call
对我来说是新事物。谢谢。 - Jouni Helske
data.table
的类似问题:https://dev59.com/Mmcs5IYBdhLWcg3wPxge - flodelinteraction
函数而不是paste0
。 - Jouni Helske