我有存储在CCD_ 1,并在下面的代码中绘制为循环。这一切都是正确的。
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
现在,我正在尝试合并存储在data.frame data_qual
中的定性数据,并尝试将其包含在第二个for循环中(如下面注释掉的部分的代码中)。但我遇到了错误: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
我试图做的是使用text()
参数将定性值放置在X_END_YEAR
位置,并稍微高于x轴。
我的方法可能出了什么问题,导致我收到如上所述的错误消息?有人知道我该怎么修吗?如有任何帮助,我们将不胜感激。当您排除第二个for loop
(注释掉的部分)时,带有示例数据的代码应该可以工作,但像这样不包括定性数据。
# 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()
}
不能使用i
进行索引,因为i
是data.frame
。您可以继续直接使用data.frame xy
0,就像您在外部for
中所做的那样。我想你想做这样的事情:
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]
)
}
但即便如此,也增加了一个不必要的for
循环。你可以说:
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)
因为text
是矢量化的,这意味着(松散地)它可以接受自变量的矢量,而不是一次一个。