gpt4 book ai didi

r - 如何根据数据集中其他列中的元素对列中的每个元素进行有条件的编号

转载 作者:行者123 更新时间:2023-12-02 18:06:57 26 4
gpt4 key购买 nike

我有一个包含数千个测量值的大型数据集。我想要的是为每个测量分配一个访问编号,以便所有三个连续测量都属于同一访问编号。连续测量三次后,访问次数增加。因此,前三个测量是访问 1,第四到第六个测量是访问 2,依此类推。当只剩下两个或更少的测量值时,我想将访问标记为缺失。

示例数据集

DF <- data.frame(ID = rep("ID01", 10),
M = 1:10)

我想要什么:

DF$V <- c(rep(1:3, each = 3), NA)

有没有办法自动实现这一点?

感谢您的帮助。

更新:如果每个测量值都包含许多其他测量值怎么办?这样:

DF <- data.frame(ID = rep("ID01", 50),
M0 = sample(50),
M = rep(1:10, each = 5))

我想要什么:

DF$V <- c(rep(rep(1:3, each = 3), each = 5), rep(NA, 5))

即使 length DF$M各级别更改(因此不固定为 n <- 15 )。例如。 length(DF$M == 1) = 21, length(DF$M == 2) = 26 等

再次感谢您的帮助。

最佳答案

一个可能的解决方案,由于@DarrenTsai的评论,现在更加简洁(感谢@DarrenTsai!):

library(dplyr)

n <- 15

DF %>%
group_by(ID) %>%
mutate(V = rep(1:(n() %/% n), each = n)[1:n()]) %>%
ungroup

#> ID M0 M V
#> 1 ID01 20 1 1
#> 2 ID01 13 1 1
#> 3 ID01 41 1 1
#> 4 ID01 21 1 1
#> 5 ID01 45 1 1
#> 6 ID01 10 2 1
#> 7 ID01 17 2 1
#> 8 ID01 43 2 1
#> 9 ID01 5 2 1
#> 10 ID01 4 2 1
#> 11 ID01 37 3 1
#> 12 ID01 22 3 1
#> 13 ID01 14 3 1
#> 14 ID01 23 3 1
#> 15 ID01 39 3 1
#> 16 ID01 33 4 2
#> 17 ID01 42 4 2
#> 18 ID01 26 4 2
#> 19 ID01 31 4 2
#> 20 ID01 1 4 2
#> 21 ID01 48 5 2
#> 22 ID01 49 5 2
#> 23 ID01 18 5 2
#> 24 ID01 29 5 2
#> 25 ID01 2 5 2
#> 26 ID01 15 6 2
#> 27 ID01 8 6 2
#> 28 ID01 32 6 2
#> 29 ID01 7 6 2
#> 30 ID01 27 6 2
#> 31 ID01 11 7 3
#> 32 ID01 9 7 3
#> 33 ID01 36 7 3
#> 34 ID01 50 7 3
#> 35 ID01 34 7 3
#> 36 ID01 40 8 3
#> 37 ID01 24 8 3
#> 38 ID01 16 8 3
#> 39 ID01 46 8 3
#> 40 ID01 3 8 3
#> 41 ID01 47 9 3
#> 42 ID01 19 9 3
#> 43 ID01 28 9 3
#> 44 ID01 6 9 3
#> 45 ID01 38 9 3
#> 46 ID01 35 10 NA
#> 47 ID01 25 10 NA
#> 48 ID01 44 10 NA
#> 49 ID01 12 10 NA
#> 50 ID01 30 10 NA

已更新

以下解决方案适用于 DF$M 级别的长度可变的情况。该解决方案基于以下想法:

  1. 计算所有 M 组中的最大行数。

  2. 对于每组 M,追加行以匹配上面提到的最大行数。

  3. 使用之前的解决方案(其代码如上)来完成OP目标。

library(dplyr)

DF <- DF %>%
slice(-30) # removes row 30, to force variable lengths in df$M

DF %>%
mutate(idaux = row_number()) %>%
add_count(M, name = "aux") %T>%
{m <<- max(.$aux)} %>%
group_by(M) %>%
slice(c(1:n(), rep(n(), m - n()))) %>%
ungroup %>%
group_by(ID) %>%
mutate(V = rep(1:(n() %/% (3*m)), each = 3*m)[1:n()]) %>%
ungroup %>%
distinct %>%
select(ID, M0, M, V) %>%
as.data.frame()

#> ID M0 M V
#> 1 ID01 18 1 1
#> 2 ID01 22 1 1
#> 3 ID01 3 1 1
#> 4 ID01 17 1 1
#> 5 ID01 40 1 1
#> 6 ID01 20 2 1
#> 7 ID01 48 2 1
#> 8 ID01 39 2 1
#> 9 ID01 25 2 1
#> 10 ID01 49 2 1
#> 11 ID01 42 3 1
#> 12 ID01 36 3 1
#> 13 ID01 11 3 1
#> 14 ID01 5 3 1
#> 15 ID01 37 3 1
#> 16 ID01 30 4 2
#> 17 ID01 45 4 2
#> 18 ID01 1 4 2
#> 19 ID01 50 4 2
#> 20 ID01 46 4 2
#> 21 ID01 15 5 2
#> 22 ID01 16 5 2
#> 23 ID01 47 5 2
#> 24 ID01 14 5 2
#> 25 ID01 27 5 2
#> 26 ID01 8 6 2
#> 27 ID01 34 6 2
#> 28 ID01 9 6 2
#> 29 ID01 7 6 2
#> 30 ID01 43 7 3
#> 31 ID01 24 7 3
#> 32 ID01 29 7 3
#> 33 ID01 13 7 3
#> 34 ID01 23 7 3
#> 35 ID01 26 8 3
#> 36 ID01 2 8 3
#> 37 ID01 21 8 3
#> 38 ID01 38 8 3
#> 39 ID01 28 8 3
#> 40 ID01 6 9 3
#> 41 ID01 44 9 3
#> 42 ID01 19 9 3
#> 43 ID01 32 9 3
#> 44 ID01 4 9 3
#> 45 ID01 12 10 NA
#> 46 ID01 10 10 NA
#> 47 ID01 35 10 NA
#> 48 ID01 33 10 NA
#> 49 ID01 41 10 NA

关于r - 如何根据数据集中其他列中的元素对列中的每个元素进行有条件的编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73048376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com