gpt4 book ai didi

r - 计算每组唯一列值的数量

转载 作者:行者123 更新时间:2023-12-02 01:25:52 24 4
gpt4 key购买 nike

我有一个看起来像这样的数据集:

name = c("john", "john", "john", "alex","alex", "tim", "tim", "tim", "ralph", "ralph")
year = c(2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012, 2014, 2016)
my_data = data.frame(name, year)

name year
1 john 2010
2 john 2011
3 john 2012
4 alex 2011
5 alex 2012
6 tim 2010
7 tim 2011
8 tim 2012
9 ralph 2014
10 ralph 2016

我想计算此数据集中的以下两项内容:

    1. 基于所有年份的分组
  • 在这些群组中,至少有一年不连续的群组数量

以 1) 为例:

# sample output for 1)

year count
1 2010, 2011, 2012 2
2 2011, 2012 1
3 2014, 2016 1

作为 2) 的示例 - 只有第 3 行(在上面的数据框中)包含缺失的年份(即 2014 年到 2016 年,没有 2015 年)。因此,输出将如下所示:

# sample output for 2)

year count
1 2014, 2016 1

有人可以告诉我如何在 R 中执行此操作吗?有没有办法确保 (2011, 2012) 被认为与 (2012, 2011) 相同?

编辑:对于使用旧版本 R 的任何人,@Rui Barradas 提供了 2) 的答案 - 我已将其包含在此处,以便在复制/粘贴时不会出现歧义:

agg <- aggregate(year ~ name, my_data, c)
agg <- agg$year[sapply(agg$year, function(y) any(diff(y) != 1))]
as.data.frame(table(sapply(agg, paste, collapse = ", ")))

最佳答案

这是基本的 R 解决方案。

# 1.
agg <- aggregate(year ~ name, my_data, paste, collapse = ", ")
as.data.frame(table(agg$year))
#> Var1 Freq
#> 1 2010, 2011, 2012 2
#> 2 2011, 2012 1
#> 3 2014, 2016 1

# 2.
agg <- aggregate(year ~ name, my_data, c)
agg <- agg$year[sapply(agg$year, \(y) any(diff(y) != 1))]
as.data.frame(table(sapply(agg, paste, collapse = ", ")))
#> Var1 Freq
#> 1 2014, 2016 1

# final clean up
rm(agg)

创建于 2022 年 12 月 3 日 reprex v2.0.2


编辑

回复评论/请求,

Is there a way to make sure that (2011, 2012) is considered the same as (2012, 2011) ?

一种方法是,在每组name中,首先按年份对数据进行排序。然后运行上面的代码。

my_data <- my_data[order(my_data$name, my_data$year), ]

关于r - 计算每组唯一列值的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74664615/

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