【问题标题】:apply statement to sample columns, across rows of different lengths将语句应用于不同长度的行的样本列
【发布时间】: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 个元素。

标签: r apply


【解决方案1】:

你的函数有错误:

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

nchar(string) - 5 之间缺少括号,导致子集出错。

然后您可以按照 cmets 中的建议简单地使用 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 个字符作为输出。

【讨论】:

  • 是的!谢谢(!)@JaroDubbeldam。就是这样。 #deathbyparen。
猜你喜欢
  • 1970-01-01
  • 2019-05-31
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2012-12-13
  • 2018-02-03
相关资源
最近更新 更多