gpt4 book ai didi

R 中的 rle 函数用于组

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

下面是我的数据的样子。

City, count
Mexico, 1
Mexico, 1
London, 0
London, 1
London, 1

我正在使用 Rle 函数来计算我的值中的一致性,但无法应用组逻辑。

我尝试了循环功能,但没有奏效。

我正在寻找如下输出
Mexico, 1:2
London, 0:1
London, 1:2

最佳答案

data.table::rleid是一种将运行 ID 变量添加到分组依据的快速方法,之后聚合是典型的。如果您愿意,可以将它借用于 dplyr 上下文:

library(dplyr)

df <- data_frame(City = c("Mexico", "Mexico", "London", "London", "London"),
count = c(1L, 1L, 0L, 1L, 1L))

df %>%
group_by(run = data.table::rleid(City, count), City) %>%
summarise(count = paste(count[1], n(), sep = ':'))
#> # A tibble: 3 x 3
#> # Groups: run [?]
#> run City count
#> <int> <chr> <chr>
#> 1 1 Mexico 1:2
#> 2 2 London 0:1
#> 3 3 London 1:2

但是这个数据不足以区分普通分组和运行分组。重新采样使其更具代表性的数据集,

set.seed(47)    # for reproducibility
df2 <- df %>% slice(sample(nrow(.), 10, replace = TRUE))

df2 %>%
group_by(run = data.table::rleid(City, count), City) %>%
summarise(count = paste(count[1], n(), sep = ':'))
#> # A tibble: 8 x 3
#> # Groups: run [?]
#> run City count
#> <int> <chr> <chr>
#> 1 1 London 1:1
#> 2 2 Mexico 1:1
#> 3 3 London 1:2
#> 4 4 London 0:1
#> 5 5 London 1:1
#> 6 6 Mexico 1:1
#> 7 7 London 0:2
#> 8 8 London 1:1

如果你愿意,同样的逻辑都在 data.table 中:

library(data.table)

setDT(df2)[,
.(count = paste(count[1], .N, sep = ':')),
by = .(run = rleid(City, count), City)]
#> run City count
#> 1: 1 London 1:1
#> 2: 2 Mexico 1:1
#> 3: 3 London 1:2
#> 4: 4 London 0:1
#> 5: 5 London 1:1
#> 6: 6 Mexico 1:1
#> 7: 7 London 0:2
#> 8: 8 London 1:1

或基础R:

df2$run <- data.table::rleid(df2$City, df2$count)

aggregate(count ~ City + run, df2, function(x) paste(x[1], length(x), sep = ':'))
#> City run count
#> 1 London 1 1:1
#> 2 Mexico 2 1:1
#> 3 London 3 1:2
#> 4 London 4 0:1
#> 5 London 5 1:1
#> 6 Mexico 6 1:1
#> 7 London 7 0:2
#> 8 London 8 1:1

关于R 中的 rle 函数用于组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983556/

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