0

I have a dataset (etter.art) from a test where i compare two apps. I have written a script to correct it where the correct answers becomes a 1, and the wrong answer becomes a 0.

etter.art <- read.csv("etter_artsnavn.csv", header = TRUE, sep = ";")
str(etter.art)
'data.frame':   12 obs. of  13 variables:
 $ nummer      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ app         : chr  "app1" "app2" "app2" "app2" ...
 $ kunne_arter : int  3 4 3 5 2 6 3 3 4 4 ...
 $ bloskjell   : chr  "Blåskjell" "blåskjell" "blåskjell" "blåskjell" ...
 $ kamskjell   : chr  "knivskjell" "kamskjell" "kamskjell" "kamskjell" ...
 $ haneskjell  : chr  "haneskjell" "haneskjell" "knivskjell" "knivskjell" ...
 $ purpursnegel: chr  "?" "snegleskall" "vet ikke" "kongkylie" ...
 $ strandkrabbe: chr  "tangkrabbe" "krabbe" "vet ikke" "krabbe" ...
 $ sagtang     : chr  "?" "tang" "vet ikke" "tang" ...
 $ sauetang    : chr  "sauetang" "grisetang" "spiraltang" "grisetang" ...
 $ sol         : chr  "?" "blæretang" "vet ikke" "tare" ...
 $ bleretang   : chr  "spiraltang" "spiraltang" "sauetang" "bleretang" ...
 $ grisetang   : chr  "grisetang" "sauetang" "grisetang" "sauetang" ...

etter.art$bloskjell = ifelse(etter.art$bloskjell=="Blåskjell",1, 
                        ifelse(etter.art$bloskjell=="blåskjell",1,0))
etter.art$kamskjell = ifelse(etter.art$kamskjell=="Kamskjell",1, 
                        ifelse(etter.art$kamskjell=="kamskjell",1,0))
etter.art$haneskjell = ifelse(etter.art$haneskjell=="Haneskjell",1, 
                        ifelse(etter.art$haneskjell=="haneskjell",1,0))
etter.art$purpursnegel = ifelse(etter.art$purpursnegel=="Purpursnegel",1, 
                        ifelse(etter.art$purpursnegel=="purpursnegel",1,0))
etter.art$sagtang = ifelse(etter.art$sagtang=="Sagtang",1, 
                        ifelse(etter.art$sagtang=="sagtang",1,0))
etter.art$strandkrabbe = ifelse(etter.art$strandkrabbe=="Strandkrabbe",1, 
                        ifelse(etter.art$strandkrabbe=="strandkrabbe",1,0))
etter.art$sauetang = ifelse(etter.art$sauetang=="Sauetang",1, 
                        ifelse(etter.art$sauetang=="sauetang",1,0))
etter.art$sol = ifelse(etter.art$sol=="Søl",1, 
                       ifelse(etter.art$sol=="søl",1,0))
etter.art$bleretang = ifelse(etter.art$bleretang=="Bleretang",1, 
                        ifelse(etter.art$bleretang=="bleretang",1,0))
etter.art$grisetang = ifelse(etter.art$grisetang=="Grisetang",1, 
                        ifelse(etter.art$grisetang=="grisetang",1,0))
etter.art$resultat <- rowSums(etter.art[-(1:3)])

However I will have multiple tests and want to write this as a function so that I don't have write all of that for every version of my test.

rett.test <- function(i){
        i$bloskjell = ifelse(i$bloskjell=="Blåskjell",1, 
                                     ifelse(i$bloskjell=="blåskjell",1,0))
        i$kamskjell = ifelse(i$kamskjell=="Kamskjell",1, 
                                     ifelse(i$kamskjell=="kamskjell",1,0))
        i$haneskjell = ifelse(i$haneskjell=="Haneskjell",1, 
                                      ifelse(i$haneskjell=="haneskjell",1,0))
        i$purpursnegel = ifelse(i$purpursnegel=="Purpursnegel",1, 
                                        ifelse(i$purpursnegel=="purpursnegel",1,0))
        i$sagtang = ifelse(i$sagtang=="Sagtang",1, 
                                   ifelse(i$sagtang=="sagtang",1,0))
        i$strandkrabbe = ifelse(i$strandkrabbe=="Strandkrabbe",1, 
                                        ifelse(i$strandkrabbe=="strandkrabbe",1,0))
        i$sauetang = ifelse(i$sauetang=="Sauetang",1, 
                                    ifelse(i$sauetang=="sauetang",1,0))
        i$sol = ifelse(i$sol=="Søl",1, 
                               ifelse(i$sol=="søl",1,0))
        i$bleretang = ifelse(i$bleretang=="Bleretang",1, 
                                     ifelse(i$bleretang=="bleretang",1,0))
        i$grisetang = ifelse(i$grisetang=="Grisetang",1, 
                                     ifelse(i$grisetang=="grisetang",1,0))
        i$resultat <- rowSums(i[-(1:3)])
        i
}

This only prints my result, I want to change my input like the version without the function. Basically I want to send my etter.art with text into the function and get an etter.art that has numbers.

I have tried using apply(etter.art, MARGIN=c(1,2), FUN = rett.test), but then I just get an error saying $ operator is invalid for atomic vectors

I probably did some basic mistake some place, and I'm to new to R to see it.

zx8754
  • 52,746
  • 12
  • 114
  • 209
Fredrik
  • 1
  • 1
  • 1
    Read about `tolower()` which will reduce the code by 50%. Also, see this post to deal with accented letters: https://stackoverflow.com/q/15253954/680068 – zx8754 Jan 19 '22 at 11:24
  • Please provide example dataset: `dput(head(etter.art))` – zx8754 Jan 19 '22 at 11:32
  • Assign the result of the function to a variable (maybe with the same name, e.g. `etter.art <- rett.test(etter.art)`, but not necessarily. – user2554330 Jan 19 '22 at 11:40
  • @user2554330 Thanks, now it works perfectly, such an easy fix – Fredrik Jan 19 '22 at 13:08

0 Answers0