将data.table中的数字变量转换为group by id中的字符变量

将data.table中的数字变量转换为group by id中的字符变量,r,group-by,data.table,R,Group By,Data.table,我有以下两个数据集,我试图找出每组的第一个观察结果。在下面的示例中,您可以看到第一个数据集(“df1”)中按“id”进行分组的效果与预期的一样(案例1)。当我在第二个数据集(df2)(案例2a)中按“id2”分组时,它也起作用。然而,当我在第二个数据集中(case2b)按“id1”分组时,它并没有起作用(如预期的那样)。令人惊讶的是,当我将“id1”转换为字符向量时,我得到了预期的输出 #case1 df1<- structure(list(id = c(1, 1, 1, 2, 2, 2,

我有以下两个数据集,我试图找出每组的第一个观察结果。在下面的示例中,您可以看到第一个数据集(“df1”)中按“id”进行分组的效果与预期的一样(案例1)。当我在第二个数据集(df2)(案例2a)中按“id2”分组时,它也起作用。然而,当我在第二个数据集中(case2b)按“id1”分组时,它并没有起作用(如预期的那样)。令人惊讶的是,当我将“id1”转换为字符向量时,我得到了预期的输出

#case1
df1<- structure(list(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3), stopId = structure(c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("a", "b", "c"), class = "factor"), 
    stopSequence = c(1, 2, 3, 3, 1, 4, 3, 1, 2)), .Names = c("id", 
"stopId", "stopSequence"), row.names = c(NA, -9L), class = "data.frame")

# first observation of each id: 

setDT(df)[,.SD[1,],by=.(id)] #worked

#df2
df2<-structure(list(id1 = c(201601072952201, 201601072952201, 201601072952201, 
201601072952213, 201601072952213, 201601072952213, 201601072952212, 
201601072952212, 201601072952212, 201601072952176), id2 = c("TXT", 
"TXT", "TXT", "TXT", "TXT", "TXT", "PLP", "PLP", "PLP", "KYK"
), sb = c(32L, 32L, 32L, 32L, 32L, 32L, 58L, 58L, 58L, 6L), bb = c(7L, 
7L, 7L, 56L, 56L, 56L, 28L, 28L, 28L, 47L), qt = c(21, 21, 21, 
420, 420, 420, 1000, 1000, 1000, 13), amt = c(301, 301, 301, 
306, 306, 306, 515, 515, 515, 368), rate = c(6321, 6321, 6321, 
128520, 128520, 128520, 515000, 515000, 515000, 4784)), .Names = c("id1", 
"id2", "sb", "bb", "qt", "amt", "rate"), class = "data.frame", row.names = c(NA, 
-10L))
#case2a
setDT(df2)[,.SD[1,],by=.(id2)] #worked
   id2             id1 sb bb   qt amt   rate
1: TXT 201601072952201 32  7   21 301   6321
2: PLP 201601072952212 58 28 1000 515 515000
3: KYK 201601072952176  6 47   13 368   4784

#case2b
 setDT(df2)[,.SD[1,],by=.(id1)] #not worked as expected
               id1 id2 sb bb qt amt rate
1: 201601072952201 TXT 32  7 21 301 6321

df2$id1<-as.character(df2$id1)
 setDT(df2)[,.SD[1,],by=.(id1)] # worked
#案例1

df1尝试在
base
中使用标准函数。例如:

df2[!duplicated(df2$id1),]
输出:

           id1 id2 sb bb   qt amt   rate
1: 2.016011e+14 TXT 32  7   21 301   6321
2: 2.016011e+14 TXT 32 56  420 306 128520
3: 2.016011e+14 PLP 58 28 1000 515 515000
4: 2.016011e+14 KYK  6 47   13 368   4784

这真是奇怪的行为。顺便说一句:(1)你不需要在
.SD[1,]
.SD[1]
中使用逗号,而且(2)你也可以只使用:
setDT(df2)[,head(.SD,1),as.character(id1)]
df2[,uniqueN(id1)]\1
——不要用浮点数作为键。@Frank:你能详细说明一下吗?当然可以。ID列应该是分类的。使用整数、大整数、整数存储格式(如
IDate
)或字符。这里使用的浮动,如果你把它们当作分类变量来对待,它们通常会表现不好;非常大或非常小的浮动肯定会引起麻烦。感谢@Frank的澄清。
unique
duplicated
都有
数据。表
方法。您也可以简单地
唯一(df2,by=“id”)
。在发布这些“尝试”建议之前,最好做一些研究。