【问题标题】:How to combine strings in R with the `+` sign?如何将 R 中的字符串与“+”号组合起来?
【发布时间】:2023-01-09 00:39:04
【问题描述】:

我有一个 if 语句,如果传递给函数的参数 case 长于 1,则数据框的第一个 colname 将是 case 的前两个值的组合:

  for(i in 1:length(case)){
    if (length(case) > 1){
      colnames(scores)[1] = case[[i]] + case[[i+1]]
    } else {
      colnames(scores)[1] = case  
      
    }
  }
  

问题出在case[[i]] + case[[i+1]] 部分。例如,在 Python 中,如果执行 a + b,结果将是 ab。在这里我不知道该怎么做。我想要的是,如果上面的条件是TRUE,那么scores的第一列将变成case[[i]] + case[[i+1]]

case 只是一个包含字符串的向量,例如 case = c('CR','PD')。有时我会传递一个值,有时会传递更多值。就我而言,我希望 scores 的第一列为 CRPD 或类似的内容。

如果我尝试上面的代码,我会得到这个错误,这当然是因为 CRPD 是字符串,这里不会像在 python 中那样工作:

Error in case[[i]] + case[[i + 1]] : 
  non-numeric argument to binary operator

【问题讨论】:

  • 你能让你的问题重现吗?

标签: r string if-statement


【解决方案1】:

您的代码有两个问题。

首先,+ 不会像在 Python 中那样在 R 中为字符串连接重载。相反,请使用 paste()(默认分隔符 = " ")或 paste0()(分隔符 = "")。例如,paste0(case[[i]], case[[i+1]])

其次,您的 for 循环没有意义,如果我理解您的目标,则不需要。如所写,它会在每次迭代中覆盖第一列名称,并且在最后一次迭代中,case[[i + 1]] 尝试访问比向量总长度大一个的索引,根据定义,向量的总长度是不存在的。

使用 paste0() 并放弃 for 循环:

if (length(case) > 1) {
  colnames(scores)[1] <- paste0(case[[1]], case[[2]])
} else {
  colnames(scores)[1] <- case
}

head(scores)

      CRPD Gender treatment Cancer_Type CD4-T-cells
Pt1     PD   male  anti-PD1    Melanoma -0.07410987
Pt10    SD female  anti-PD1    Melanoma -0.09440127
Pt101   PR female  anti-PD1    Melanoma  0.04102849
Pt103   PD female  anti-PD1    Melanoma -0.16330295
Pt106   PD   male  anti-PD1    Melanoma -0.09424782
Pt11    PD female  anti-PD1    Melanoma -0.16731441

如果您的目标是连接全部case 的元素,无论长度如何,您也可以去掉 if 语句,只需执行以下操作:

colnames(scores)[1] <- paste0(case, collapse = "")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多