我有一个类似以下内容的数据集:

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. Groups based on all years个 ==同步,由长者更正==
      1. And of these groups, the number of groups with at least one non-consecutive year个 ==同步,由长者更正==

以1)为例:

# sample output for 1)

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

作为2)的一个例子,只有行3(在上述数据框中)包含丢失的年份(即,没有2015年的2014至2016年).因此,输出将如下所示:

# 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 = ", ")))

推荐答案

以下是BASE 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-03年第reprex v2.0.2


Edit

响应于该 comments /请求,

有没有办法确保(2011,2012)与(2012,2011)被认为是相同的?

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

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

R相关问答推荐

编码变量a、b、c以匹配来自另一个数据点的变量x

以R中的正确顺序将日期时间字符列转换为posixct

如何对数据集进行逆向工程?

如何从R中的字符串元素中减go 一个数字?

使用case_match()和char数组重新编码值

计算时间段的ECDF(R)

使用整齐的计算(curl -curl )和杂音

将小数分隔符放在R中的前两位数字之后

如何在R中描绘#符号?

如何删除最后一个可操作对象

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

使用RSelenium在R中抓取Reddit时捕获多个标签

KM估计的差异:SvyKm与带权重的调查

在R中的数据框上使用Apply()函数时,如何保留非数字列?

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

整理曲线图、曲线图和点图

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?

R,将组ID分配给另一个观测ID变量中的值的组合

如何使用包含要子集的值的列表或数据框来子集多个列?

在shiny /bslb中,当卡片是从json生成时,如何水平排列卡片?