我得到了一个数据框df,它根据像这样的坐标表示几个对象:
object latitude longitude
1 42 5
2 43 4
3 43 4
4 45 3
5 45 3
6 50 2
如您所见,df是根据坐标排序的。
对于某些测试,我想将每个对象链接到第二个最近的对象。 更确切地说,我希望我的数据框看起来像这样(删除最后一行):
object latitude longitude
1 43 4
2 45 3
3 45 3
4 50 2
5 50 2
我尝试了这段代码:
for (i in 2:nrow(df_obs_all_synth_agro_zone)) {
l<-c()
while ((df_obs_all_synth_agro_zone$lon[i]==df_obs_all_synth_agro_zone$lon[i-1]) && (df_obs_all_synth_agro_zone$lat[i]==df_obs_all_synth_agro_zone$lat[i-1])) {#if coordinates =
l<-c(l,i)
i=i+1
#print(i) issue
}
#I transforme the rows concerned
print(i)
print(l)
#if length>1, only one row is changed in the dataframe
if (length(l)>1){
df_obs_all_synth_agro_zone[(l[1]-1):l[-1],]<-transform(df_obs_all_synth_agro_zone[(l[1]-1):l[-1],], df_obs_all_synth_agro_zone$lon[(l[1]-1):l[-1]] <- c(df_obs_all_synth_agro_zone$lon[i], NA))
df_obs_all_synth_agro_zone[(l[1]-1):l[-1],]<-transform(df_obs_all_synth_agro_zone[(l[1]-1):l[-1],], df_obs_all_synth_agro_zone$lat[(l[1]-1):l[-1]] <- c(df_obs_all_synth_agro_zone$lat[i], NA))
i=i+1
}
else if (length(l)==1){
df_obs_all_synth_agro_zone[l[1],"lon"]<-df_obs_all_synth_agro_zone$lon[i]
df_obs_all_synth_agro_zone[l[1],"lat"]<-df_obs_all_synth_agro_zone$lat[i]
df_obs_all_synth_agro_zone[l[1]-1,"lon"]<-df_obs_all_synth_agro_zone$lon[i]
df_obs_all_synth_agro_zone[l[1]-1,"lat"]<-df_obs_all_synth_agro_zone$lat[i]
i=i+1
}
else {
df_obs_all_synth_agro_zone[i-1,"lon"]<-df_obs_all_synth_agro_zone$lon[i]
df_obs_all_synth_agro_zone[i-1,"lat"]<-df_obs_all_synth_agro_zone$lat[i]
i=i+1
}
}
问题在代码的这一部分中:
if (length(l)>1){
df_obs_all_synth_agro_zone[(l[1]-1):l[-1],]<-transform(df_obs_all_synth_agro_zone[(l[1]-1):l[-1],], df_obs_all_synth_agro_zone$lon[(l[1]-1):l[-1]] <- c(df_obs_all_synth_agro_zone$lon[i], NA))
df_obs_all_synth_agro_zone[(l[1]-1):l[-1],]<-transform(df_obs_all_synth_agro_zone[(l[1]-1):l[-1],], df_obs_all_synth_agro_zone$lat[(l[1]-1):l[-1]] <- c(df_obs_all_synth_agro_zone$lat[i], NA))
i=i+1
代码只更改了一行,而没有更改我想要的所有行,我也不知道为什么。