kurdtc
kurdtc

Reputation: 1621

R: Adding qualitative data using a text() argument to a for loop: unknown index type 'list' error message

I have sample data which is stored in a data.frame xy and which is plotted in for loop like in the code below. This works all correctly.

xy <- data.frame(NAME=c("NAME1","NAME1","NAME1","NAME2","NAME2","NAME2","NAME3","NAME3"),ID=c(87,87,87,199,199,199,233,233), X_START_YEAR=c(1950,1988,1994,1899,1909,1924,1945,1948),Y_START_VALUE=c(75,25,-90,-8,-55,-10,-9,12),X_END_YEAR=c(1985,1994,1999,1904,1924,1987,1946,1949), Y_END_VALUE=c(20,50,-15,-70,-80,-100,24,59))

   NAME  ID X_START_YEAR Y_START_VALUE X_END_YEAR Y_END_VALUE
1 NAME1  87         1950            75       1985          20
2 NAME1  87         1988            25       1994          50
3 NAME1  87         1994           -90       1999         -15
4 NAME2 199         1899            -8       1904         -70
5 NAME2 199         1909           -55       1924         -80
6 NAME2 199         1924           -10       1987        -100
7 NAME3 233         1945            -9       1946          24
8 NAME3 233         1948            12       1949          59

Now I am trying to incorporate qualitative data which is stored in a data.frame data_qual and I am trying to include this in a second for loop (as in the code below the part that is commented out). But I am running into the error: error in ind[i]: unknown index type 'list'

data_qual <- data.frame(NAME=c("NAME2","NAME3"),ID=c(199,233),X_START_YEAR=c(1986,1905), Y_START_VALUE=c("-X","ST"),X_END_YEAR=c(1987,1907),Y_END_VALUE=c("-X","ST"))

  NAME  ID  X_START_YEAR Y_START_VALUE X_END_YEAR Y_END_VALUE
1 NAME2 199         1986            -X       1987          -X
2 NAME3 233         1905            ST       1907          ST

What I am trying to do is to place the qualitative values using a text() argument to place it at its X_END_YEAR position and slightly above the x axis.

What could be wrong about my approach so that I get an error message as indicated above? Does anyone have an idea how I could fix it? Any help is kindly appreciated. The code with the sample data should work when you exclude the second for loop (the part that is commented out) but like this doesn't include the qualitative data.

# split xy by group as defined by ID
ind <- split(xy,xy$ID)

for (i in ind){
  xx = unlist(i[,grep('X_',colnames(i))])
  yy = unlist(i[,grep('Y_',colnames(i))])    
  fname <- paste0(i[1, 'ID'], '.png')
  png(fname, width=1679, height=1165, res=150)
  if(any(xx < 1946)) {my_x_lim <- c(min(xx), 2014)} else {my_x_lim <- c(1946, 2014)} 
  par(mar=c(6,8,6,5))
  plot(xx, 
       yy,
       main=unique(i[,1]),
       xlab="Time [Years]",
       ylab="Value [m]",
       pch=21, bg='white',
       xlim = my_x_lim,font.lab=2, cex.lab=1.2, cex.axis=1.1)
  axis(1, at = seq(1000, 2050, 5), cex.axis=1, labels=FALSE, tcl=-0.3)
  axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3)
  abline(h=0, col = "gray60")
  i <- i[,-1]
  segments(i[,2],i[,3],i[,4],i[,5],lwd=2)
  points(xx, yy, pch=21, bg='white', cex=0.7)
  title(sub=i$warn, adj=0.035, line=-1.5, font=3, cex=1)

  if (i$ID[1] %in% data_qual%ID){
    rel_data_qual <- data_qual[data_qual$ID %in% i$ID,]
    text(x = rel_data_qual$X_END_YEAR,
         y = min(i$Y_END_VALUE + 3),
         labels = rel_data_qual$Y_END_VALUE)  
  }  
      dev.off()
    }  

Upvotes: 0

Views: 128

Answers (1)

nograpes
nograpes

Reputation: 18323

You cannot use i to index, because i is a data.frame. You can continue using i directly, as you did in the outer for. I think you were trying to do something like this:

for(j in 1:length(which(data_qual$ID %in% i$ID))) {
  text(
         x = data_qual[data_qual$ID %in% i$ID, 'X_END_YEAR'] [j],
         y = min(i$Y_END_VALUE+3),
    labels = data_qual[data_qual$ID %in% i$ID, 'Y_END_VALUE'] [j]
  )
}  

But even that is adding an unnecessary for loop. You could just say:

rel_data_qual <- data_qual[data_qual$ID %in% i$ID,]
text(x = rel_data_qual$X_END_YEAR,
     y = min(i$Y_END_VALUE + 3),
     labels = rel_data_qual$Y_END_VALUE)

Because text is vectorized, meaning (loosely) that it can accept vectors of arguments, rather than one at a time.

Upvotes: 1

Related Questions