r - 按分组编号观察

  显示原文与译文双语对照的内容

我试图对组内的观察进行编号,然后确定每个组内的第一个和最后。 我知道怎么做,甚至在这里发布了解决方案,以响应过去的问题。

但是,我现在遇到了一种情况,我的解决方案无法工作,我无法找出原因。 谢谢你关于如何获得下面的第二个例子的建议。 第一个例子是工作。 抱歉,如果我忽略了一个愚蠢的错误。

我更喜欢使用基础 R 。


####################################################################

# this works

my.df = read.table(text = '
 state county city miles
 1 1 1 3
 1 1 1 4
 1 1 1 4
 1 1 1 5
 1 1 2 4
 1 1 2 3
 1 2 1 4
 1 2 2 2
 1 2 2 4
 1 2 2 3
 1 2 3 3
 1 2 3 2
', header = TRUE)

my.df
str(my.df)

my.seq <- data.frame(rle(my.df$city)$lengths)
my.seq

my.df$first <- unlist(apply(my.seq, 1, function(x) seq(1,x)))
my.df$last <- unlist(apply(my.seq, 1, function(x) seq(x,1,-1)))
my.df

my.df2 <- my.df[my.df$first==1 | my.df$last == 1,]
my.df2

####################################################################

# This does not work. Only the data set has changed.

my.df <- read.table(text = '
 state county city miles
 40 8 1 12
 40 8 1 4
 40 8 2 13
 40 8 2 3
', header = TRUE)

my.df
str(my.df)

my.seq <- data.frame(rle(my.df$city)$lengths)
my.seq

my.df$first <- unlist(apply(my.seq, 1, function(x) seq(1,x)))
my.df$last <- unlist(apply(my.seq, 1, function(x) seq(x,1,-1)))
my.df

my.df2 <- my.df[my.df$first==1 | my.df$last == 1,]
my.df2

# The expected result with the second example is:

desired.result <- read.table(text = '
 state county city miles first last
 40 8 1 12 1 2
 40 8 1 4 2 1
 40 8 2 13 1 2
 40 8 2 3 2 1
', header = TRUE)

####################################################################

时间: 作者:

Ii complicated你 try do 。

我想你会因为特殊城市的特殊情况而出现错误 !

我将如何执行这里操作:

这里的难点是创建分组变量:


xx <- rle(my.df$city)
my.df$group <- rep(seq_along(xx$values),xx$lengths)

然后使用 ddply,你可以获取每个组的第一个和最后一个:


library(plyr)
res <- ddply(my.df,.(group),function(x){
 y <- rbind(head(x,1),tail(x,1))
 cbind(y,data.frame(first=c(1,nrow(x)),
 last = c(nrow(x),1)))
})

最后,使用 unique 删除重复的元素:


unique(res)

 state county city miles group first last
1 40 8 1 12 1 1 2
2 40 8 1 4 1 2 1
3 40 8 2 13 2 1 2
4 40 8 2 3 2 2 1

编辑基 R 解决方案,只需将 ddply 替换为 tapply:


group <- rep(seq_along(xx$values),xx$lengths)

tapply(my.df,group,function(x){
 y <- rbind(head(x,1),tail(x,1))
 cbind(y,data.frame(first=c(1,nrow(x)),
 last = c(nrow(x),1)))
})
unique(res)

作者:

我知道了如何修改代码,以便通过两个示例数据集得到所需的答案。

我只是在两个 unlist(apply()) 语句周围添加了 as.vector() 。 下面是第二个示例的代码:


my.df <- read.table(text = '
 state county city miles
 40 8 1 12
 40 8 1 4
 40 8 2 13
 40 8 2 3
', header = TRUE)

my.df
str(my.df)

my.seq <- data.frame(rle(my.df$city)$lengths)
my.seq

my.df$first <- as.vector(unlist(apply(my.seq, 1, function(x) seq(1,x))))
my.df$last <- as.vector(unlist(apply(my.seq, 1, function(x) seq(x,1,-1))))
my.df

my.df2 <- my.df[my.df$first==1 | my.df$last == 1,]
my.df2

以下是结果:


 state county city miles first last
1 40 8 1 12 1 2
2 40 8 1 4 2 1
3 40 8 2 13 1 2
4 40 8 2 3 2 1

作者:
...