【发布时间】:2017-07-09 20:07:49
【问题描述】:
我正在尝试编写一个简单的 R 函数来对单个数据帧的两列中的 5 元素子字符串进行采样。每一行的字符串长度相等,但它们在列中不同。当我指定要操作的行和列时,该函数起作用,但我无法让应用语句对每一行和每一列起作用。如所写,它只会根据第一个实例的长度提取随机样本,因此如果第一个实例比任何其他字符串短,则其他行的输出有时会少于 5 个元素。
例子df:
BP TF
1 CGTCTCTATTCTAGGCAAGA TTTFFFFTFFFTFFFTFTTT
2 AAGTCACTCGAATTCGGATGCCCCCTAGGC TTFFFFFTFFFFTTFTFFTTTFTTTTFTFF
3 TGCTCATGACGGGAC FFFTFTFFFFTFTFT
'预期输出:'
1 CTATT FFTFF
2 CCTAG TTTFT
3 TCATG TFTFF
'可重现的示例代码:'
#make fake data frame
BaseP1 <- paste(sample(size = 20, x = c("A","C","T","G"), replace = TRUE), collapse = "")
BaseP2 <- paste(sample(size = 30, x = c("A","C","T","G"), replace = TRUE), collapse = "")
BaseP3 <- paste(sample(size = 15, x = c("A","C","T","G"), replace = TRUE), collapse = "")
TrueFalse1 <- paste(sample(size = 20, x = c("T","F"), replace = TRUE), collapse = "")
TrueFalse2 <- paste(sample(size = 30, x = c("T","F"), replace = TRUE), collapse = "")
TrueFalse3 <- paste(sample(size = 15, x = c("T","F"), replace = TRUE), collapse = "")
my_df <- data.frame(c(BaseP1,BaseP2,BaseP3), c(TrueFalse1, TrueFalse2, TrueFalse3))
Fragment = function(string) {
nStart = sample(1:nchar(string) -5, 1)
substr(string, nStart, nStart + 4)
}
Fragment(string = my_df[1,1])#works for the first row, first col.
但这不起作用:
apply(my_df, c(1,2), function(x) Fragment(string = my_df[1:nrow(my_df),1:ncol(my_df)]))
【问题讨论】:
-
这不是你想要的吗?
apply(my_df, c(1,2), Fragment) -
就
sapply(my_df, Fragment) -
@JarkoDubbeldam 不,这会产生少于 5 个元素的绘图。
-
不适合我。
-
@JarkoDubbeldam,这是随机抽签,所以她不会每次都出现短序列。重复几次 - 它们并不总是 5 个元素。