0

I have two dataframes:

> SubObj

sNumber runningTrialNo  wordTar      SubObj_ind

1       34              nerd         3
1       32              hooligan     1
1       7               villager     3
2       32              oak          2
2       8               deer         2
3       8               mammal       3

> df

sNumber runningTrialNo  wordTar

1       34              nerd
1       34              nerd
1       34              nerd
1       32              hooligan
1       32              hooligan
1       7               villager
2       32              oak
2       32              oak
2       8               deer
3       8               mammal
3       8               mammal

I want to map values from SubObj$SubObj_ind into df$SubObj, so all the values would be in accordance with sNumber (subject number) and runningTrialNo (trial number). It should look smth like this:

> df

sNumber runningTrialNo  wordTar    SubObj_ind

1       34              nerd       3
1       34              nerd       3
1       34              nerd       3
1       32              hooligan   1
1       32              hooligan   1
1       7               villager   3
2       32              oak        2
2       32              oak        2
2       8               deer       2
3       8               mammal     3
3       8               mammal     3

I wrote the code that hypothetically should do the work but it doesn't map over trial and subject number:

 df$SubObj_indO <- array(0, nrow(df))
 for(i in 1:nrow(SubObj)) {
    index <- df$runningTrialNo == SubObj[i,"runningTrialNo"] &
       df$sNumber == SubObj[i,"sNumber"]
    df$SubObj_ind[index] <- SubObj[index, "SubObj_ind"]
 }

What is wrong in this peace of the code?

MariKo
  • 305
  • 4
  • 15

1 Answers1

0

We can use match

df$SubObj_ind <- with(df, SubObj$SubObj_ind[match(wordTar, SubObj$wordTar)])
df
#     sNumber runningTrialNo  wordTar SubObj_ind
#1        1             34     nerd          3
#2        1             34     nerd          3
#3        1             34     nerd          3
#4        1             32 hooligan          1
#5        1             32 hooligan          1
#6        1              7 villager          3
#7        2             32      oak          2
#8        2             32      oak          2
#9        2              8     deer          2
#10       3              8   mammal          3
#11       3              8   mammal          3

Or use data.table

library(data.table)
setDT(df)[SubObj[c("wordTar", "SubObj_ind")], on = "wordTar"]
akrun
  • 874,273
  • 37
  • 540
  • 662
  • thanks! however, on my bigger dataframes it doesn't map accuratly through all trials and subjects – MariKo Jan 01 '17 at 14:43
  • @MariKo Try with `data.table` (updated my post) – akrun Jan 01 '17 at 15:27
  • I receive an error and then set `allow.cartesian = TRUE` to avoid this error. however, the new dataframe consists of many many more rows... – MariKo Jan 02 '17 at 14:07
  • I found a better way: `new_df <- join(df, SubObj, type = "inner")`. it does the work. thank you in any case!! – MariKo Jan 02 '17 at 14:29