我在R中遇到以下问题。我有一个数据框,其中包含标识客户的值。有一个用户ID列。我需要添加另一个带有计数器的列,该数据中该特定客户的出现次数是多少。数据框按用户ID排序。所以我有类似的东西:
> niekonwersyjne[c(57:62,72:77),1]
User_ID
AMsySZa--1Og4WwseZJKRyABTWdh
AMsySZa--1Og4WwseZJKRyABTWdh
AMsySZa--1Og4WwseZJKRyABTWdh
AMsySZa--1Og4WwseZJKRyABTWdh
AMsySZa--1Og4WwseZJKRyABTWdh
AMsySZa--1qZghdxj4gypoSQRt_F
AMsySZa--2gL6xRCZFUCOXtpYxNs
AMsySZa--2gL6xRCZFUCOXtpYxNs
AMsySZa--2gL6xRCZFUCOXtpYxNs
AMsySZa--2gL6xRCZFUCOXtpYxNs
AMsySZa--2gL6xRCZFUCOXtpYxNs
AMsySZa--2gL6xRCZFUCOXtpYxNs
但是需要这样的东西:
> niekonwersyjne[c(57:62,72:77),c(1,11)]
User_ID Counter
AMsySZa--1Og4WwseZJKRyABTWdh 1
AMsySZa--1Og4WwseZJKRyABTWdh 2
AMsySZa--1Og4WwseZJKRyABTWdh 3
AMsySZa--1Og4WwseZJKRyABTWdh 4
AMsySZa--1Og4WwseZJKRyABTWdh 5
AMsySZa--1qZghdxj4gypoSQRt_F 1
AMsySZa--2gL6xRCZFUCOXtpYxNs 1
AMsySZa--2gL6xRCZFUCOXtpYxNs 2
AMsySZa--2gL6xRCZFUCOXtpYxNs 3
AMsySZa--2gL6xRCZFUCOXtpYxNs 4
AMsySZa--2gL6xRCZFUCOXtpYxNs 5
AMsySZa--2gL6xRCZFUCOXtpYxNs 6
我可以通过循环执行此操作,但数据框具有超过20密耳的观察值,因此计算时间过于高。还有其他方法可以实现这个结果吗?
我现在使用的循环如下所示:
niekonwersyjne$Counter<-1
for (i in 2:nrow(niekonwersyjne)) {
if (niekonwersyjne[i-1,"User_ID"]==niekonwersyjne[i,"User_ID"]) {
niekonwersyjne[i,"Counter"]<-niekonwersyjne[i-1,"Counter"]+1} else {
niekonwersyjne[i,"Counter"]<-1
}
}
答案 0 :(得分:1)
我发现data.table
方法相当不错:
library( data.table )
setDT( df )[ , counter := seq_len( .N ), by = User_ID ]
这会根据by
参数(此处为User_ID
)将数据“拆分”为子集,并为每个组添加一个序列,其长度与组本身相同。
或者使用dplyr
library( dplyr )
df <- df %>%
group_by( User_ID ) %>%
mutate( counter = seq_len( n() ) )
答案 1 :(得分:1)
使用dplyr包,您可以使用以下
library(dplyr)
niekonwersyjne %>% group_by(User_ID) %>% mutate(Counter = row_number())
答案 2 :(得分:1)
另一个dplyr回答......
df %>% group_by(User_ID) %>% mutate(ct = 1, counter = cumsum(ct))
答案 3 :(得分:1)
我们可以在sequence
base R
与df1$Counter <- unname(sequence(table(df1$User_ID)))
df1$Counter
#[1] 1 2 3 4 5 1 1 2 3 4 5 6
一起使用
NSDate