R 将字符串向量中的每个元素追加到重复的数字序列
我有一个没有示例名称的数据帧。我有这些示例名称的向量,但长度不等于数据帧中的行。这是因为每个样本都有几个“峰值”行 我想将示例名称向量的第一个元素附加到“Peaks”中从1开始的每个重复的数字序列 以下是我所拥有的: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
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
fromzoo
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))]