例如,如何获得列“rank”的值?这里,该值在 Dataframe 中每2个记录增加一次。认为它可以是任何#个记录,而不是2。我确实找到了一些类似的帖子,但它们并不完全是我所需要的。| 月数|秩|| - -----|- -----|| 一个|一个|| 2|一个|| 三个|2|| 4| 2|| 5个|三个|| 六|三个|| 七个|4|| 八|4|
gywdnpxw1#
根据nrow(dat)/n使用rep和each=参数。
nrow(dat)/n
rep
each=
f <- \(dat, n) { stopifnot(nrow(dat) %% n == 0) ## for safety rep(seq_len(nrow(dat)/n), each=n) } f(dat, 1) # [1] 1 2 3 4 5 6 7 8 f(dat, 2) # [1] 1 1 2 2 3 3 4 4 f(dat, 3) # Error in f(dat, 3) : nrow(dat)%%n == 0 is not TRUE f(dat, 4) # [1] 1 1 1 1 2 2 2 2 f(dat, nrow(dat)) # [1] 1 1 1 1 1 1 1 1
要获得不相等的组,可以实现override=选项。
override=
f2 <- \(dat, n, override=FALSE) { if (!override) { stopifnot(nrow(dat) %% n == 0) rep(seq_len(nrow(dat)/n), each=n) } else { rep(seq_len(nrow(dat)), each=n)[seq_len(nrow(dat))] } } f2(dat, 3, override=TRUE) # [1] 1 1 1 2 2 2 3 3
或者,稍微优雅一点:
f3 <- \(dat, n) { sort.int(rep_len(1:n, nrow(dat))) } f3(dat, 0) # [1] 0 0 0 0 1 1 1 1 f3(dat, 1) # [1] 1 1 1 1 1 1 1 1 f3(dat, 2) # [1] 1 1 1 1 2 2 2 2 f3(dat, 3) # [1] 1 1 1 2 2 2 3 3 f3(dat, 8) # [1] 1 2 3 4 5 6 7 8 f3(dat, 9) # [1] 1 2 3 4 5 6 7 8 f3(dat, -1) # [1] -1 -1 0 0 0 1 1 1
dat <- structure(list(Months = 1:8, rank = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L)), class = "data.frame", row.names = c(NA, -8L))
enxuqcxy2#
假设我们有一个数据如下
letters 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H
然后我们做一些如下的事情
df <- data.frame(letters=c(LETTERS[1:8]), Months=c(1:8)) %>% mutate(rank1=(Months %% 2), rank2=ifelse(rank1==1,Months, NA_real_)) %>% fill(rank2) %>% mutate(rank=data.table::rleid(rank2)) %>% select(-c('rank1','rank2')) # output letters Months rank 1 A 1 1 2 B 2 1 3 C 3 2 4 D 4 2 5 E 5 3 6 F 6 3 7 G 7 4 8 H 8 4
cl25kdpy3#
请尝试下面的代码
df <- data.frame(Months=c(1:8)) %>% mutate(rank1=(Months %% 2), rank2=ifelse(rank1==1,Months, NA_real_), ) %>% fill(rank2) %>% mutate(rank=data.table::rleid(rank2)) %>% select(-c('rank1','rank2')) # output Months rank 1 1 1 2 2 1 3 3 2 4 4 2 5 5 3 6 6 3 7 7 4 8 8 4
3条答案
按热度按时间gywdnpxw1#
根据
nrow(dat)/n
使用rep
和each=
参数。要获得不相等的组,可以实现
override=
选项。或者,稍微优雅一点:
enxuqcxy2#
假设我们有一个数据如下
然后我们做一些如下的事情
cl25kdpy3#
请尝试下面的代码