首页 > 解决方案 > 将字符串向量中的每个元素附加到重复的数字序列中

问题描述

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

我想将样本名称向量的第一个元素附加到“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

我想按顺序添加我的 sample_names 向量的每个元素,对于每个重复的数字序列来得到这个:

Sample Peak Value
S1     1    101     
S1     2    102     
S1     3    103     
S2     1    104     
S2     2    105     
S3     1    106     
S3     2    107     
S3     3    108     
S3     4    109 

任何帮助将不胜感激 :)

标签: rdataframedata.table

解决方案


一个选项dplyrrep在获得具有累积总和的分组元素的计数后找到“Sample_Names”

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   

或使用data.table

library(data.table)
setDT(Data)[, Sample := rep(Sample_Names, tabulate(cumsum(Peak==1))) ]

或者另一个选项na.locf来自zoo

library(zoo)
setDT(Data)[Peak == 1, Sample := Sample_Names][, Sample := na.locf(Sample)][]

推荐阅读