R 将字符串向量中的每个元素追加到重复的数字序列

R 将字符串向量中的每个元素追加到重复的数字序列,r,dataframe,data.table,R,Dataframe,Data.table,我有一个没有示例名称的数据帧。我有这些示例名称的向量,但长度不等于数据帧中的行。这是因为每个样本都有几个“峰值”行 我想将示例名称向量的第一个元素附加到“Peaks”中从1开始的每个重复的数字序列 以下是我所拥有的: Sample_Names <- c("S1","S2","S3") Data <- tibble(Peak = c(1:3,1:2,1:4), Value = c(101:109)) Peak Value 1 101

我有一个没有示例名称的数据帧。我有这些示例名称的向量,但长度不等于数据帧中的行。这是因为每个样本都有几个“峰值”行

我想将示例名称向量的第一个元素附加到“Peaks”中从1开始的每个重复的数字序列

以下是我所拥有的:

Sample_Names <- c("S1","S2","S3")

Data <- tibble(Peak = c(1:3,1:2,1:4),
                   Value = c(101:109))



Peak Value
 1    101       
 2    102       
 3    103       
 1    104       
 2    105       
 1    106       
 2    107       
 3    108       
 4    109

任何帮助都将不胜感激:)

我们可以使用
cumsum
创建一个计数器,当
Peak==1
时,该计数器将递增,并将其用于子集
样本名称

Data$Sample <- Sample_Names[cumsum(Data$Peak == 1)]

# A tibble: 9 x 3
#   Peak Value Sample
#  <int> <int> <chr> 
#1     1   101 S1    
#2     2   102 S1    
#3     3   103 S1    
#4     1   104 S2    
#5     2   105 S2    
#6     1   106 S3    
#7     2   107 S3    
#8     3   108 S3    
#9     4   109 S3    

使用
dplyr
的一个选项是
rep
在获得具有累积和的分组元素计数后,应用“样本名称”

library(dplyr)
Data %>%
    mutate(Sample =  rep(Sample_Names, tabulate(cumsum(Peak==1))))
# A tibble: 9 x 3
#   Peak Value Sample
#  <int> <int> <chr> 
#1     1   101 S1    
#2     2   102 S1    
#3     3   103 S1    
#4     1   104 S2    
#5     2   105 S2    
#6     1   106 S3    
#7     2   107 S3    
#8     3   108 S3    
#9     4   109 S3   
或者另一个选项是
na.locf
from
zoo

library(zoo)
setDT(Data)[Peak == 1, Sample := Sample_Names][, Sample := na.locf(Sample)][]
在R基地,你可以

Sample_Names[cummax(ave(Data$Peak, Data$Peak, FUN = seq_along))]

您可以从数据中使用
rowid
。表`
data%>%mutate(Sample=Sample\u Names[cummax(rowid(Peak)))
这些解决方案中有几个非常有效,谢谢!将样本名称分配给序列中的每个第一个数字,然后再填充是非常简单的。干杯
library(data.table)
setDT(Data)[, Sample := rep(Sample_Names, tabulate(cumsum(Peak==1))) ]
library(zoo)
setDT(Data)[Peak == 1, Sample := Sample_Names][, Sample := na.locf(Sample)][]
library(dplyr)
library(tidyr)

Data %>%
    group_by(Peak) %>%
    mutate(Sample = row_number()) %>%
    ungroup() %>%
    mutate(Sample = Sample_Names[cummax(Sample)])
Sample_Names[cummax(ave(Data$Peak, Data$Peak, FUN = seq_along))]