dplyr组进行变异,以选择类别的最后一个索引行,从而给出错误
我有这样一个数据框:dplyr组进行变异,以选择类别的最后一个索引行,从而给出错误,r,dplyr,R,Dplyr,我有这样一个数据框: > df <- data.frame(x = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2), type = c('a', 'a', 'a', 'b', 'a', 'a', 'b', 'a', 'b', 'a', 'b')) > df x type 1 1 a 2 1 a 3 1 a 4 1 b 5 1 a 6 1 a 7 1 b 8 2 a 9 2 b 1
> df <- data.frame(x = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2), type = c('a', 'a', 'a', 'b', 'a', 'a', 'b', 'a', 'b', 'a', 'b'))
> df
x type
1 1 a
2 1 a
3 1 a
4 1 b
5 1 a
6 1 a
7 1 b
8 2 a
9 2 b
10 2 a
11 2 b
在这种情况下,我的期望输出如下:
> dfout
x type lastA
1 1 a 1
2 1 a 2
3 1 a 3
4 1 b 3
5 1 a 5
6 1 a 6
7 1 b 6
8 2 a 1
9 2 b 1
10 2 a 3
11 2 b 3
我们可以使用
minu-rank/cumsum
来实现这一点。我们按“x”分组,然后得到逻辑索引的cumsum
(type=='a'
),并用min\u rank
将其包装到rank
输出
library(dplyr)
df %>%
group_by(x) %>%
mutate(lastA= min_rank(cumsum(type=='a')))
# Source: local data frame [11 x 3]
#Groups: x [2]
# x type lastA
# (dbl) (fctr) (int)
#1 1 a 1
#2 1 a 2
#3 1 a 3
#4 1 b 3
#5 1 a 5
#6 1 a 6
#7 1 b 6
#8 2 a 1
#9 2 b 1
#10 2 a 3
#11 2 b 3
我们可以使用
minu-rank/cumsum
来实现这一点。我们按“x”分组,然后得到逻辑索引的cumsum
(type=='a'
),并用min\u rank
将其包装到rank
输出
library(dplyr)
df %>%
group_by(x) %>%
mutate(lastA= min_rank(cumsum(type=='a')))
# Source: local data frame [11 x 3]
#Groups: x [2]
# x type lastA
# (dbl) (fctr) (int)
#1 1 a 1
#2 1 a 2
#3 1 a 3
#4 1 b 3
#5 1 a 5
#6 1 a 6
#7 1 b 6
#8 2 a 1
#9 2 b 1
#10 2 a 3
#11 2 b 3
我们可以使用
minu-rank/cumsum
来实现这一点。我们按“x”分组,然后得到逻辑索引的cumsum
(type=='a'
),并用min\u rank
将其包装到rank
输出
library(dplyr)
df %>%
group_by(x) %>%
mutate(lastA= min_rank(cumsum(type=='a')))
# Source: local data frame [11 x 3]
#Groups: x [2]
# x type lastA
# (dbl) (fctr) (int)
#1 1 a 1
#2 1 a 2
#3 1 a 3
#4 1 b 3
#5 1 a 5
#6 1 a 6
#7 1 b 6
#8 2 a 1
#9 2 b 1
#10 2 a 3
#11 2 b 3
我们可以使用
minu-rank/cumsum
来实现这一点。我们按“x”分组,然后得到逻辑索引的cumsum
(type=='a'
),并用min\u rank
将其包装到rank
输出
library(dplyr)
df %>%
group_by(x) %>%
mutate(lastA= min_rank(cumsum(type=='a')))
# Source: local data frame [11 x 3]
#Groups: x [2]
# x type lastA
# (dbl) (fctr) (int)
#1 1 a 1
#2 1 a 2
#3 1 a 3
#4 1 b 3
#5 1 a 5
#6 1 a 6
#7 1 b 6
#8 2 a 1
#9 2 b 1
#10 2 a 3
#11 2 b 3
可能有一种更简单的方法,但您可以添加
lastA
作为每组的行号,用NA
替换为type==“b”
替换为replace
或ifelse
,然后用package zoo中的NA.locf
填写:df%>%groupby(x)%>%mutate(lastA=ifelse(type==“a”,row\u number(),NA))%%>%NA.locf()
当x=3时,第一种类型是b时,您希望lastA做什么?我修改了数据集以使其更清晰。每个“类型”可能有多个a/b序列,我希望b行假定最后看到的a的最后一行号。您还可以使用tidyr
中的fill
函数(目前仅在开发版本中),如上面的@aosmith used na.locf:df%>%group\u by(x)%>%mutate(lastA=ifelse(type==“a”,row\u number(),na))>%fill(lastA)
可能有一种更简单的方法,但您可以将lastA
添加为每组的行号,用NA
替换为type==“b”
替换为replace
或ifelse
,然后用package zoo中的NA.locf
填充:df%>%groupy\u by(x)%>%mutate(lastA=ifelse)(type=“a”,row_number(),NA))%%>%NA.locf()
当x=3时,第一种类型是b,您希望lastA做什么?我修改了数据集,使其更加清晰。每个“类型”可能有多个a/b序列,我希望b行采用上次看到的a的最后一行编号。您还可以使用tidyr
中的fill
函数(仅在目前的开发版本中,@aosmith使用了上面的na.locf:df%>%groupu\u by(x)%%>%mutate(lastA=ifelse(type==“a”,row\u number(),na))%%>%fill(lastA)
可能有一种更简单的方法,但您可以将lastA
添加为每个组的行号,替换为na
fortype==“b”
替换为或一个ifelse
,然后用package zoo中的na.locf
填充:df%>%groupby(x)%%>%mutate(lastA=ifelse(type==“a”,row\u number(),na))%%>%na.locf()
当x=3时,第一种类型是b时,你想要lastA做什么?我修改了数据集以使其更清晰。每个“类型”可能有多个a/b序列,我希望b行假定最后看到的a的最后一行编号。你也可以使用tidyr
中的填充功能(目前仅在开发版本中),就像上面的@aosmith使用了na.locf:df%>%groupu\u by(x)%%>%mutate(lastA=ifelse(type==“a”,row\u number(),na))%%>%fill(lastA)
可能有一种更简单的方法,但您可以将lastA
添加为每组的行号,替换为na
表示type==“b”
替换为或一个ifelse
,然后用package zoo中的na.locf
填充:df%>%groupby(x)%%>%mutate(lastA=ifelse(type==“a”,row\u number(),na))%%>%na.locf()
当x=3时,第一种类型是b时,你想要lastA做什么?我修改了数据集以使其更清晰。每个“类型”可能有多个a/b序列,我希望b行假定最后看到的a的最后一行编号。你也可以使用tidyr
中的填充功能(目前仅在开发版本中),如上面的@aosmith使用了na.locf:df%>%group\u by(x)%%>%mutate(lastA=ifelse(type==“a”,row\u number(),na))%%>%fill(lastA)
Masterful。您能评论一下我使用max/which的方法为什么失败吗?想知道我缺少的是什么吗。@user3949008根据预期的输出,我不确定您为什么要将max
与which
一起使用,which
只返回满足以下条件的元素的位置条件。假设v1精通。您能评论一下为什么我使用max/which的方法失败了吗?想知道我缺少的是什么吗。@user3949008根据预期的输出,我不确定您为什么使用max
和which
which
只返回那些满足条件的元素。假设v1精通。您能评论一下为什么我使用max/which的方法失败了吗?想知道我缺少的是什么吗。@user3949008根据预期的输出,我不确定您为什么要使用max
和哪个哪个在一起ly返回那些满足条件的元素的位置。假设v1 Masterful。你能评论一下为什么我使用max/which的方法失败了吗?想知道我缺少的是什么吗。@user3949008基于预期的输出,我不确定你为什么要将max
与which仅返回满足条件的元素的位置。假设v1