将data.table中的数字变量转换为group by id中的字符变量
我有以下两个数据集,我试图找出每组的第一个观察结果。在下面的示例中,您可以看到第一个数据集(“df1”)中按“id”进行分组的效果与预期的一样(案例1)。当我在第二个数据集(df2)(案例2a)中按“id2”分组时,它也起作用。然而,当我在第二个数据集中(case2b)按“id1”分组时,它并没有起作用(如预期的那样)。令人惊讶的是,当我将“id1”转换为字符向量时,我得到了预期的输出将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,
#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”)
。在发布这些“尝试”建议之前,最好做一些研究。