【问题标题】:for loop and if statement gives wrong argument [duplicate]for循环和if语句给出错误的参数[重复]
【发布时间】:2020-09-13 07:20:47
【问题描述】:

我有以下代码:

df1 <- data.frame(items=c("^TP53$","^PTEN","^BRACA1$","^SYNE4$","^ATM$"),condition = rnorm(5), 
                  parameter = rnorm(5), id = rnorm(5), reading = rnorm(5))
df1
listid<-gsub('[$|^]',"", df1$items)
protein<-c("PTEN")
fkeep <- NULL
for (i in 1:length(listid)) {
  if (!protein) {discard <- grep(paste0("^", listid[i], "$"), df1$items, fixed = T)}
  else {hits <- grep(paste0("^", listid[i]), df1$items, fixed = T)}
  fkeep <- c(fkeep, hits)
  # print(fkeep)
}

我有一个数据框 df1,如果“listid”中的名称不在“蛋白质”中,则将其保存以丢弃,相反,如果在“蛋白质”中,则将其保存到命中,并且仅保留命中 但是我收到以下错误:

Error in !protein : invalid argument type 

【问题讨论】:

  • 如果我理解正确的话,这似乎是一种非常低效的方式来做你想做的事。至少你可以用hits &lt;- intersect(listid, protein)discard &lt;- setdiff(listid, protein) 替换循环。您还可以在问题中添加您希望实现的精确输出。

标签: r for-loop if-statement


【解决方案1】:

所以有多个问题:

df1 <- data.frame(items=c("^TP53$","^PTEN","^BRACA1$","^SYNE4$","^ATM$"),condition = rnorm(5), 
                  parameter = rnorm(5), id = rnorm(5), reading = rnorm(5))
df1

listid<-gsub('[$|^]',"", df1$items)

protein<-"PTEN" # this is only 1 item so no c()
fkeep <- NULL
for (i in 1:length(listid)) {
  if (listid[i]!=protein) {discard <- grep(paste0("^", listid[i], "$"), df1$items, fixed = T)} 

# protein is a variable containing only a single argument but you want to choose this argument from listid 
# so you have to loop through listid in search for protein

  else {hits <- grep(paste0("^", listid[i]), df1$items, fixed = T)}
  fkeep <- c(fkeep, hits)
   print(fkeep)
}

再次查看您的代码后,我发现您的 grep 代码无法正常工作,因此我冒昧地对其进行了一些重写:

for (i in seq_along(listid)){
  if (listid[i]!=protein){
    hits <- sub("^", "", paste0(listid[i], df1$items[i], "$"), fixed=T)
    print(hits)}
    
  #else #{discard<-grep("^", paste0(listid[i], df1$items[i], "$"), fixed=T) # sets protein row to 1
        #{discard<-sub("^", "",paste0(listid[i], df1$items[i]), fixed=T) # changes ^PTEN to PTENPTEN
    #print(discard)}
    
}

结果现在取决于您运行的丢弃版本

【讨论】:

  • c(fkeep, hits) 中的错误:找不到对象“命中”
  • 现在它给出了这个错误,我认为循环不起作用
  • 我编辑了答案。循环对我来说工作得很好,虽然我认为它只输出数字而不是字符串,但我认为你会想要。您的 grep() 命令错误。我留下了原来的答案,所以你可以比较命令。如果我误解了,请举例说明您希望结果的样子
  • 我想这不是我想要的。
  • 我想检查listid的元素是否在蛋白质中,如果不是,它将从列数据框中grep所有不在蛋白质中的元素并将它们保存在丢弃向量中(我的意思是他们的数字)所以丢弃 = int 1 3 4 5
【解决方案2】:

注意它是如何告诉您 !Protein 中有错误的。 包括感叹号。

R 中的!!= 不同。 ! 只能应用于布尔向量。您需要改用 == FALSE!= 这样的二元运算符。

代码失败是因为! 期望你给它一个布尔向量。除此之外,蛋白质也只有 1 个元素,因此没有理由在其上使用 c()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多