I am trying to use an ifelse statement inside apply and am getting an odd result. I get the expected answer if the variable marker is 1, but not when that variable is > 9.
Here is an example data set for which I get the correct answer:
my.data <- read.table(text = '
REFNO status stage marker cumulative newstage
1018567 ccc AA 0 1 AA
1018567 aaa NONE 0 1 NONE
1018567 aaa BB 1 1 BB
1018567 bbb CC 1 1 CC
1018567 eee CC 1 1 CC
1018567 mmm CC 1 1 CC
1018567 ppp CC 1 1 CC
1019711 ddd CC 1 1 CC
', header = TRUE, stringsAsFactors = FALSE)
my.data$newstage <- apply(my.data, 1, function(x) ifelse(x['status'] == 'aaa' &
x['stage'] == 'NONE' &
x['marker'] == 0 &
x['cumulative'] > 0, 'BB', x['stage']))
my.data
The data set below differs in only one element from that above, but I do not obtain the correct answer.
my.data <- read.table(text = '
REFNO status stage marker cumulative newstage
1018567 ccc AA 0 1 AA
1018567 aaa NONE 0 1 NONE
1018567 aaa BB 1 1 BB
1018567 bbb CC 1 1 CC
1018567 eee CC 1 1 CC
1018567 mmm CC 1 1 CC
1018567 ppp CC 1 1 CC
1019711 ddd CC 14 1 CC
', header = TRUE, stringsAsFactors = FALSE)
my.data$newstage <- apply(my.data, 1, function(x) ifelse(x['status'] == 'aaa' &
x['stage'] == 'NONE' &
x['marker'] == 0 &
x['cumulative'] > 0, 'BB', x['stage']))
my.data
Thank you for any suggestions. Perhaps I should be using an if statement instead of an if-else?
Specifically, I would like NONE to be replaced with BB for newstage in the second row.
If you look at apply(my.data2, 1, function(x) x), the marker column has two characters instead of one. This is because of the two digit 14. The coercion to character pads the column with spaces to the length of its longest (most characters) element. This produces " 0" == 0 in your code, which is FALSE. However, "0" == 0 is TRUE
" 0" == 0
# [1] FALSE
"0" == 0
# [1] TRUE
Since ifelse is vectorized, you don't need to use apply at all. You could add the new column with within (or with, as akrun mentions) or simply with newstage <- ifelse(...)
within(my.data2, {
newStage <- ifelse(status == "aaa" & stage == "NONE" & marker == 0 &
cumulative > 0, "BB", stage)
})
# REFNO status stage marker cumulative newstage newStage
# 1 1018567 ccc AA 0 1 AA AA
# 2 1018567 aaa NONE 0 1 NONE BB
# 3 1018567 aaa BB 1 1 BB BB
# 4 1018567 bbb CC 1 1 CC CC
# 5 1018567 eee CC 1 1 CC CC
# 6 1018567 mmm CC 1 1 CC CC
# 7 1018567 ppp CC 1 1 CC CC
# 8 1019711 ddd CC 14 1 CC CC
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With