R 按组确定值的首次出现及其在组中的位置
我想知道“参与者”列中的每个组在“信号”列(参与者)中首次出现值“1”的时间。值“1”的计数应指向组 下面是一个示例数据帧R 按组确定值的首次出现及其在组中的位置,r,R,我想知道“参与者”列中的每个组在“信号”列(参与者)中首次出现值“1”的时间。值“1”的计数应指向组 下面是一个示例数据帧 > dfInput <- data.frame(Participants=c( 'A','A','A','B','B','B','B','C','C'), Signal=c(0, 1, 1, 0, 0, 0, 1, 1,0)) > dfInput Participants Signal 1 A 0 2
> dfInput <- data.frame(Participants=c( 'A','A','A','B','B','B','B','C','C'), Signal=c(0, 1, 1, 0, 0, 0, 1, 1,0))
> dfInput
Participants Signal
1 A 0
2 A 1
3 A 1
4 B 0
5 B 0
6 B 0
7 B 1
8 C 1
9 C 0
>dfInput dfInput
参与者信号
1 A 0
2 A 1
3 A 1
4B0
5 B 0
6B0
7 B 1
8 C 1
9c0
这是我想要的结果:
> dfOutput <-data.frame(Participants=c( 'A','B','C'), RowNumberofFirst1=c(2, 4, 1))
> dfOutput
Participants RowNumberofFirst1
1 A 2
2 B 4
3 C 1
>dfOutput dfOutput
参与者排名第一1
1 A 2
2 B 4
3 C 1
问题与此类似:
然而,我无法相应地调整它,以创建我的输出df我认为这就是您所寻找的
library(dplyr)
dfInput %>%
group_by(Participants) %>%
summarise(RowNumberofFirst1 = which(Signal == 1)[1])
我想这就是你要找的
library(dplyr)
dfInput %>%
group_by(Participants) %>%
summarise(RowNumberofFirst1 = which(Signal == 1)[1])
使用
tidyverse
:
dfInput%>%
group_by(Participants)%>%
mutate(max=cumsum(Signal),
RowNumberofFirst1=row_number())%>%
filter(max==1)%>%
top_n(-1,RowNumberofFirst1)%>%
select(Participants,RowNumberofFirst1)
# A tibble: 3 x 2
# Groups: Participants [3]
Participants RowNumberofFirst1
<fct> <int>
1 A 2
2 B 4
3 C 1
dInput%>%
分组依据(参与者)%>%
突变(最大值=累计值(信号),
RowNumberofFirst1=行数())%>%
过滤器(最大==1)%>%
顶部n(-1,RowNumberofFirst1)%
选择(参与者,RowNumberofFirst1)
#一个tibble:3x2
#分组:参与者[3]
参与者排名第一1
1 A 2
2 B 4
3 C 1
带tidyverse
:
dfInput%>%
group_by(Participants)%>%
mutate(max=cumsum(Signal),
RowNumberofFirst1=row_number())%>%
filter(max==1)%>%
top_n(-1,RowNumberofFirst1)%>%
select(Participants,RowNumberofFirst1)
# A tibble: 3 x 2
# Groups: Participants [3]
Participants RowNumberofFirst1
<fct> <int>
1 A 2
2 B 4
3 C 1
dInput%>%
分组依据(参与者)%>%
突变(最大值=累计值(信号),
RowNumberofFirst1=行数())%>%
过滤器(最大==1)%>%
顶部n(-1,RowNumberofFirst1)%
选择(参与者,RowNumberofFirst1)
#一个tibble:3x2
#分组:参与者[3]
参与者排名第一1
1 A 2
2 B 4
3 C 1
d输入%
分组依据(参与者)%>%#每个参与者
总结(NumFirst1=min(row_number()[Signal==1]))#获取Signal=1的最小行数
##tibble:3 x 2
#参与者NumFirst1
#
#1 A 2
#2 B 4
#3 C 1
如果要返回已标识的行(即所有列值),可以使用以下方法:
set.seed(5)
dfInput <- data.frame(Participants=c( 'A','A','A','B','B','B','B','C','C'),
Signal=c(0, 1, 1, 0, 0, 0, 1, 1,0),
A = sample(c("C","D","F"),9, replace = T),
B = sample(c("N","M","K"),9, replace = T))
library(dplyr)
dfInput %>%
group_by(Participants) %>%
filter(row_number() == min(row_number()[Signal == 1])) %>%
ungroup()
# # A tibble: 3 x 4
# Participants Signal A B
# <fct> <dbl> <fct> <fct>
# 1 A 1 F N
# 2 B 1 D N
# 3 C 1 F M
set.seed(5)
D输入%
分组依据(参与者)%>%
过滤器(行号()==min(行号()[信号==1]))%>%
解组()
##tibble:3 x 4
#参与者发出A B信号
#
#1 A 1 F N
#2b1dn
#3c1fm
因此,在这种情况下,您可以使用filter
为每个参与者返回等于最小行号的行,其中Signal
为1。dInput%
分组依据(参与者)%>%#每个参与者
总结(NumFirst1=min(row_number()[Signal==1]))#获取Signal=1的最小行数
##tibble:3 x 2
#参与者NumFirst1
#
#1 A 2
#2 B 4
#3 C 1
如果要返回已标识的行(即所有列值),可以使用以下方法:
set.seed(5)
dfInput <- data.frame(Participants=c( 'A','A','A','B','B','B','B','C','C'),
Signal=c(0, 1, 1, 0, 0, 0, 1, 1,0),
A = sample(c("C","D","F"),9, replace = T),
B = sample(c("N","M","K"),9, replace = T))
library(dplyr)
dfInput %>%
group_by(Participants) %>%
filter(row_number() == min(row_number()[Signal == 1])) %>%
ungroup()
# # A tibble: 3 x 4
# Participants Signal A B
# <fct> <dbl> <fct> <fct>
# 1 A 1 F N
# 2 B 1 D N
# 3 C 1 F M
set.seed(5)
D输入%
分组依据(参与者)%>%
过滤器(行号()==min(行号()[信号==1]))%>%
解组()
##tibble:3 x 4
#参与者发出A B信号
#
#1 A 1 F N
#2b1dn
#3c1fm
因此,在这种情况下,您可以使用
filter
为每个参与者返回一行,该行等于Signal
为1的最小行数。下面是一个基本R
的解决方案:
dfInput <- data.frame(Participants=c( 'A','A','A','B','B','B','B','C','C'), Signal=c(0, 1, 1, 0, 0, 0, 1, 1,0))
tapply(dfInput$Signal, dfInput$Participants, FUN=function(x) min(which(x==1)))
# > tapply(dfInput$Signal, dfInput$Participants, FUN=function(x) min(which(x==1)))
# A B C
# 2 4 1
下面是一个使用base
R
的解决方案:
dfInput <- data.frame(Participants=c( 'A','A','A','B','B','B','B','C','C'), Signal=c(0, 1, 1, 0, 0, 0, 1, 1,0))
tapply(dfInput$Signal, dfInput$Participants, FUN=function(x) min(which(x==1)))
# > tapply(dfInput$Signal, dfInput$Participants, FUN=function(x) min(which(x==1)))
# A B C
# 2 4 1
另一个基本R通过
聚合
aggregate(Signal~Participants, dfInput, function(i)which(i == 1)[1])
# Participants Signal
#1 A 2
#2 B 4
#3 C 1
另一个基本R通过聚合
aggregate(Signal~Participants, dfInput, function(i)which(i == 1)[1])
# Participants Signal
#1 A 2
#2 B 4
#3 C 1
变量:aggregate(信号~参与者,数据输入,函数(x)匹配(1,x))
a变量:aggregate(信号~参与者,数据输入,函数(x)匹配(1,x))
谢谢,效果很好!我还添加了as.data.frame()以获得dataframe输出。现在我想知道的是,对于标识的行,其他两列中的值是什么。因此,让我们假设dfInput还有两个列C5和C6,它们具有不同的条目。现在我想在输出数据框中显示这些内容。因此,输出将是:“代码”#参与者NumFirst1 C5 C6#1 A 2悉尼墨尔本#2 B 4布里斯班墨尔本#3 C 1珀斯珀斯,即城市名称出现在dfInputI中标识的行中。我想我明白你的意思了。我已经更新了我的答案。看一看,让我知道。谢谢你,是的,这是有效的(对不起,在前面的评论混乱的格式)。我意识到,在结果数据帧中,知道信号出现的行数是很方便的。例如,对于参与者组A,它是第2行,对于参与者组B,它是第4行。是否有方法将此信息添加为附加列?您可以在筛选器之前添加mutate(row=row_number())
,以保留要保留的行的位置。谢谢,这很有效!我还添加了as.data.frame()以获得dataframe输出。现在我想知道的是,对于标识的行,其他两列中的值是什么。因此,让我们假设dfInput还有两个列C5和C6,它们具有不同的条目。现在我想在输出数据框中显示这些内容。因此,输出将是:“代码”#参与者NumFirst1 C5 C6#1 A 2悉尼墨尔本#2 B 4布里斯班墨尔本#3 C 1珀斯珀斯,即城市na