Home > Software design >  How to use a for-loop on column ranges for plotting without using all combination of i and j?
How to use a for-loop on column ranges for plotting without using all combination of i and j?

Time:12-24

I am trying to print likert plots with a nested for-loop. Well, it works, but I would like the for function to not "retake" the i and j, which means I want to plot 1:5, 6:10, 11:15, and so on. But not all possible combinations of these variables.

library(likert)

for(i in c(1, 6, 11, 16)){
  for (j in c(5, 10, 15, 20)) {
    print(plot(likert(data.likert[, i:j])))
  }
} 

Any better ideas?

Here comes a data example (sorry it is a bit long):

data.likert <- structure(list(
  Q1 = structure(c(5L,5L, 5L, 4L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("Stimme überhaupt nicht zu", "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", "Weiß nicht/keine Angabe"), class = "factor"), 
 Q2 = structure(c(5L,5L, 5L, 4L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("Stimme überhaupt nicht zu", "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
"Weiß nicht/keine Angabe"), class = "factor"), 
Q3 = structure(c(2L, 4L, 5L, 5L, 4L, 4L, 5L, 4L, 4L, 4L), .Label = c("Stimme überhaupt nicht zu", "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
"Weiß nicht/keine Angabe"), class = "factor"), 
Q4 = structure(c(1L, 4L, 2L, 2L, 2L, 1L, 3L, 3L, 2L, 3L), .Label = c("Stimme überhaupt nicht zu", 
"Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", "Weiß nicht/keine Angabe"), class = "factor"), 
Q5 = structure(c(1L, 2L, 2L, 4L, 2L, 1L, 4L, 2L, 2L, 5L), .Label = c("Stimme überhaupt nicht zu", 
"Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
"Weiß nicht/keine Angabe"), class = "factor"), 
Q6 = structure(c(1L, 
1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L), .Label = c("Stimme überhaupt nicht zu", 
"Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
"Weiß nicht/keine Angabe"), class = "factor"), 
Q7 = structure(c(4L, 3L, 4L, 1L, 3L, NA, 2L, 2L, 2L, NA), .Label = c("Stimme überhaupt nicht zu", 
"Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", "Weiß nicht/keine Angabe"), class = "factor"), 
Q8 = structure(c(4L, 4L, 4L, 2L, 2L, 4L, 1L, NA, 2L, NA), .Label = c("Stimme überhaupt nicht zu", "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
"Weiß nicht/keine Angabe"), class = "factor"), 
Q9 = structure(c(3L, 2L, 2L, 5L, 3L, 5L, 2L, 3L, 4L, 4L), .Label = c("Stimme überhaupt nicht zu", 
 "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
 "Weiß nicht/keine Angabe"), class = "factor"), 
Q10 = structure(c(5L, 5L, 2L, 4L, 4L, 5L, 3L, 5L, 4L, 5L), .Label = c("Stimme überhaupt nicht zu", 
 "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
 "Weiß nicht/keine Angabe"), class = "factor"), 
Q11 = structure(c(5L,5L, 5L, 5L, 5L, 5L, 5L, 4L, 5L, 5L), .Label = c("Stimme überhaupt nicht zu", 
"Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
"Weiß nicht/keine Angabe"), class = "factor"), 
Q12 = structure(c(5L, 5L, 2L, 4L, 4L, 5L, 4L, 5L, 5L, 5L), .Label = c("Stimme überhaupt nicht zu", 
 "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
 "Weiß nicht/keine Angabe"), class = "factor"), 
Q13 = structure(c(5L, 5L, 4L, NA, 4L, 5L, 5L, NA, 3L, 5L), .Label = c("Stimme überhaupt nicht zu", 
 "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
 "Weiß nicht/keine Angabe"), class = "factor"), 
Q14 = structure(c(2L, 2L, 4L, 1L, 4L, 1L, 4L, 3L, 2L, 4L), .Label = c("Stimme überhaupt nicht zu", 
 "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
 "Weiß nicht/keine Angabe"), class = "factor"), 
Q15 = structure(c(1L,  1L, 4L, 2L, 2L, 1L, 2L, NA, 1L, 2L), .Label = c("Stimme überhaupt nicht zu", 
 "Stimme eher nicht zu", "Weder noch", "Stimme eher zu", "Stimme voll und ganz zu", 
 "Weiß nicht/keine Angabe"), class = "factor")), row.names = c(NA, 
 10L), class = "data.frame")

CodePudding user response:

You could just take a single v and add four to get the second value.

for (i in c(1, 6, 11)) print(plot(likert(data.likert[, i:(i   4)])))

Or, using lapply.

lapply(c(1, 6, 11), \(i) plot(likert(data.likert[, i:(i   4)])))

CodePudding user response:

If we need to take the sequence from corresponding elements, use Map

Map(function(i, j) plot(likert(data.likert[, i:j])),
      c(1, 6, 11, 16), c(5, 10, 15, 20))

NOTE: In the OP's dput dataset, there are only 15 columns (assuming that it is just a subset of the original data)


Or the same in a for loop would be to create two vector sequence and loop over the sequence of one of the vectors, get the vector values based on the sequence index, return the sequence (:), extract the columns, apply likert and plot

v1 <- c(1, 6, 11, 16)
v2 <- c(5, 10, 15, 20)
for(i in seq_along(v1)) {
    print(plot(likert(data.likert[, v1[i]:v2[i])))
}
  • Related