R 按组确定值的首次出现及其在组中的位置

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

我想知道“参与者”列中的每个组在“信号”列(参与者)中首次出现值“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            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