I have an if statment, that if an argument that is passed to the function, called case
, is longer than 1, then the first colname of the data frame would be the combination of the first two values of case
:
for(i in 1:length(case)){
if (length(case) > 1){
colnames(scores)[1] = case[[i]] case[[i 1]]
} else {
colnames(scores)[1] = case
}
}
the problem is with the case[[i]] case[[i 1]]
part. In python, for example, if you do a
b
, the result would be ab
. Here I don't know how to do that. All I want is that if the condition above is TRUE
, the first column of scores
would become case[[i]] case[[i 1]]
.
case
is just a vector that contains strings, like this case = c('CR','PD')
. Sometimes I pass it with one value, sometimes more. In my case here I want the first column of scores
to be CRPD
or something like that.
If I tried the code above, I get this error, and that is of course because CR
and PD
are strings and here this won't work like in python:
Error in case[[i]] case[[i 1]] :
non-numeric argument to binary operator
CodePudding user response:
There are two issues with your code.
First,
isn’t overloaded for string concatenation in R as it is in Python. Instead, use paste()
(default separator = " "
) or paste0()
(separator = ""
). e.g., paste0(case[[i]], case[[i 1]])
.
Second, your for
loop doesn’t make sense, and isn’t needed if I understand your goal. As written, it overwrites the first column name on each iteration, and on the last iteration, case[[i 1]]
tries to access an index one greater than the total length of the vector, which by definition doesn’t exist.
Using paste0()
and ditching the for
loop:
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
If your goal is to concatenate all elements of case
regardless of length, you can get rid of the if
statement too and just do:
colnames(scores)[1] <- paste0(case, collapse = "")