【问题标题】: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 或类似的内容。
如果我尝试上面的代码,我会得到这个错误,这当然是因为 CR 和 PD 是字符串,这里不会像在 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 = "")