load packages

library(tidyverse)

create fake data

Use c() to make vectors of TRUE/FALSE (NOTE I think the code below would work the same if the values were 1, 0)

# low items
low1 <- c(T, T, T, T, F, F, T, F, T, F, T, T)
low2 <- c(T, F, T, T, T, T, F, T, T, T, T, T)
low3 <- c(F, T, T, T, F, T, T, F, F, T, T, T)

# column bind
low <- cbind(low1, low2, low3)

# med items
med1 <- c(T, T, F, F, F, T, F, F, F, F, F, F)
med2 <- c(T, F, T, T, T, F, F, T, F, F, F, F)
med3 <- c(T, F, T, F, T, T, F, T, F, T, F, T)
med4 <- c(T, F, T, F, F, T, F, F, T, F, F, T)
med5 <- c(T, F, T, T, T, F, F, T, F, F, F, F)
med6 <- c(F, F, F, F, F, F, F, F, F, F, F, F)

# column bind
med <- cbind(med1, med2, med3, med4, med5, med6)

#high items

high1 <- c(F, F, F, F, T, F, T, F, F, F, F, F)
high2 <- c(T, F, F, F, F, T, F, F, F, F, F, F)

 # column bind
high <- cbind(high1, high2)

Bind low, med, high together and convert to a dataframe, add paperid.

all <- cbind(low, med, high) # this creates a "matrix", convert to dataframe

all<- as.data.frame(all)

# add paper id

all <- all %>%
  mutate(paperid = row_number()) %>%
  relocate(paperid, .before = low1)

glimpse(all)
## Rows: 12
## Columns: 12
## $ paperid <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
## $ low1    <lgl> TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE…
## $ low2    <lgl> TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, …
## $ low3    <lgl> FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE…
## $ med1    <lgl> TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FA…
## $ med2    <lgl> TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALS…
## $ med3    <lgl> TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE…
## $ med4    <lgl> TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FAL…
## $ med5    <lgl> TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALS…
## $ med6    <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
## $ high1   <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, F…
## $ high2   <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, F…

scoring

low items = 1 med items = 2 high items = 5

make data long

Pull wide data into two columns, one with the names of each item, and one with the T/F (yesno, 1,0) values in it.

all_long <- all %>%
  pivot_longer(names_to = "item", values_to = "yesno", low1:high2)

glimpse(all_long)
## Rows: 132
## Columns: 3
## $ paperid <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ item    <chr> "low1", "low2", "low3", "med1", "med2", "med3", "med4", "med5"…
## $ yesno   <lgl> TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,…

new score column

Use mutate to make a new column called score that gives 0 when the yes/no value is FALSE and scores of 1 for low items that are TRUE, 2 for med items that are TRUE, and 5 for high items that are TRUE.

all_scored <- all_long %>%
  mutate(score = case_when(yesno == FALSE ~ 0, 
                            item == "low1" & yesno == "TRUE" ~ 1,
                           item == "low2" & yesno == "TRUE" ~ 1,
                           item == "low3" & yesno == "TRUE" ~ 1,
                           item == "med1" & yesno == "TRUE" ~ 2,
                           item == "med2" & yesno == "TRUE" ~ 2, 
                           item == "med3" & yesno == "TRUE" ~ 2,
                           item == "med4" & yesno == "TRUE" ~ 2,
                           item == "med5" & yesno == "TRUE" ~ 2,
                           item == "med6" & yesno == "TRUE" ~ 2,
                           item == "high1" & yesno == "TRUE" ~ 5,
                           item == "high2" & yesno == "TRUE" ~ 5))

glimpse(all_scored)
## Rows: 132
## Columns: 4
## $ paperid <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ item    <chr> "low1", "low2", "low3", "med1", "med2", "med3", "med4", "med5"…
## $ yesno   <lgl> TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,…
## $ score   <dbl> 1, 1, 0, 2, 2, 2, 2, 2, 0, 0, 5, 1, 0, 1, 2, 0, 0, 0, 0, 0, 0,…

group_by paper, summarise score

Use group_by and summarise to add up the score for each paper individually. Add gt::gt() to get it to display in a nice table.

all_scored %>%
  group_by(paperid) %>%
  summarise(totalscore = sum(score)) %>%
  gt::gt()
paperid totalscore
1 17
2 4
3 11
4 7
5 12
6 13
7 7
8 7
9 4
10 4
11 3
12 7

more complicated example

more realistic data

med1X <- c(T, F, T, F, T, T, F, T, F, T, F, T)
med2X <- c("public dataset generated by authors", "Other (please specify)", "public dataset generated by authors", "Other (please specify)", "Not clear", "public dataset generated by authors", "Not clear", "public dataset generated by others", "Not clear", "Not clear", "public dataset generated by others", "Not clear")
med3X <- c(T, F, T, F, F, T, F, F, T, F, F, T)

med <- cbind(med1X, med2X, med3X)

med <- as.data.frame(med)

med <- med %>%
  mutate(paperID = row_number()) 

make datalong

med_long <- med %>%
  pivot_longer(names_to = "item", values_to = "yesno", med1X:med3X)

glimpse(med_long)
## Rows: 36
## Columns: 3
## $ paperID <int> 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7,…
## $ item    <chr> "med1X", "med2X", "med3X", "med1X", "med2X", "med3X", "med1X",…
## $ yesno   <chr> "TRUE", "public dataset generated by authors", "TRUE", "FALSE"…

new score column

OK this is a more complicated case_when. If yes/no is FALSE then make the score 0, if the items is med1X (or med3X) and yesno is TRUE, make the score 2. For item med2X, if yesno == NOt clear, make the score 0. If yesno is an item in (ie. %in%) the list of “public dataset generated by authors”, “Other (please specify)”, “public dataset generated by others”, then the score should be 2.

medXscored <- med_long %>%
  mutate(score = case_when(yesno == "FALSE" ~ 0, 
                            item == "med1X" & yesno == "TRUE" ~ 2,
                           item == "med3X" & yesno == "TRUE" ~ 2,
                          item == "med2X" & yesno == "Not clear" ~ 0, 
        item == "med2X" & yesno %in% c("public dataset generated by authors", "Other (please specify)", "public dataset generated by others") ~ 2))
                           

glimpse(medXscored)
## Rows: 36
## Columns: 4
## $ paperID <int> 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7,…
## $ item    <chr> "med1X", "med2X", "med3X", "med1X", "med2X", "med3X", "med1X",…
## $ yesno   <chr> "TRUE", "public dataset generated by authors", "TRUE", "FALSE"…
## $ score   <dbl> 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 2, 2, 2, 0, 0, 0,…
medXscored %>%
  group_by(paperID) %>%
  summarise(totalscore = sum(score)) %>%
  gt::gt()
paperID totalscore
1 6
2 2
3 6
4 2
5 2
6 6
7 0
8 4
9 2
10 2
11 2
12 4