Reputation: 1621
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
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