r语言 - 将语句应用于不同长度的行的示例列

  • 本文关键字:r语言 语句 应用于 r apply
  • 更新时间 :
  • 英文 :


我正在尝试编写一个简单的 R 函数来对单个数据帧的两列中的 5 元素子字符串进行采样。每行的字符串长度相等,但它们在列中有所不同。当我指定要操作的行和列时,该函数有效,但我无法让 apply 语句对每一行和每一列进行处理。如前所述,它只会根据第一个实例的长度提取随机样本,因此如果第一个实例比任何其他字符串短,则其他行的输出有时小于 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)]))

您的函数中存在错误:

Fragment = function(string) {
nStart = sample(1:(nchar(string) -5), 1)
substr(string, nStart, nStart + 4)
}

它缺少nchar(string) - 5之间的括号,这使得子集出错。

然后,您可以按照评论中的建议简单地使用apply(my_df, c(1,2), Fragment)

要表明这现在有效:

for(i in 1:10000){
stopifnot(all(5 == sapply(apply(my_df, c(1,2), Fragment), nchar)))
}

这表明在 10000 次尝试中,它始终产生 5 个字符作为输出。

最新更新