R语言 如何在一个栏目的基础上增加增值?

5tmbdcev  于 2023-06-27  发布在  其他
关注(0)|答案(3)|浏览(104)

例如,如何获得列“rank”的值?这里,该值在 Dataframe 中每2个记录增加一次。认为它可以是任何#个记录,而不是2。
我确实找到了一些类似的帖子,但它们并不完全是我所需要的。
| 月数|秩|
| - -----|- -----|
| 一个|一个|
| 2|一个|
| 三个|2|
| 4| 2|
| 5个|三个|
| 六|三个|
| 七个|4|
| 八|4|

gywdnpxw

gywdnpxw1#

根据nrow(dat)/n使用repeach=参数。

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=选项。

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))
enxuqcxy

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
cl25kdpy

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

相关问题