user442372
user442372

Reputation:

ifelse in 'r' returns NA value

I have two data frames, and I want to match contents of one with other, for this I am using following function:

t <- read.csv("F:/M.Tech/Semester4/Thesis/Code/Book1.csv")
s <- read.csv("F:/M.Tech/Semester4/Thesis/Code/a4.csv")
x <- nrow(s)
y <- nrow(t)
for(i in 1:x)
    for(j in 1:y)
        ifelse (match(s[i,2], t[j,1]), s[i,9] <- t[j,2] , s[i,9] <- 0)

for this code, when the contents match then it works fine. But the else part returns NA. How can I assign 0 to all the places where there is no match. I am getting the result as:

# word  count   word    tf score    word robability log values  TFxIDF score Keyword Probability
# yemen 380 yemen   1   0.053938964 2.919902172 2.919902172 NA
# strikes   116 strikes 0.305263158 0.016465578 4.106483233 1.25355804  0.5
# deadly    105 deadly  0.276315789 0.014904187 4.206113074 1.162215455 0.7
# new   88  new 0.231578947 0.012491128 4.38273661  1.014949531 NA

Instead of the NA. I want to store 0 there.

Upvotes: 0

Views: 4711

Answers (1)

arvi1000
arvi1000

Reputation: 9582

Issue 1: ifelse returns one of two values, depending on the test condition. It's not a flow control function that executes code snippet one or code snippet two based on a condition.

This is right:

my_var <- ifelse(thing_to_test, value_if_true, value_if_false)

This is wrong, and doesn't make sense in R

ifelse(thing_to_test, my_var <- value_if_true, my_var <- value_if_false)

Issue 2: make sure thing_to_test is a logical expression.

Putting those things together, you can see you should follow the instruction left by Richard Scriven as a comment above

Upvotes: 5

Related Questions