使用带if语句的嵌套for循环

使用带if语句的嵌套for循环,r,loops,for-loop,R,Loops,For Loop,我有一个两列的数据框,第一列是经度,第二列是纬度。我想找到中心单元格的坐标。 e、 g.范围为lat[31.5],lon[33.5],如果两列的第一个值满足此条件,则创建第三列并输入值31.25,创建第四列并输入值33.25 我尝试过嵌套for循环,但它不起作用 # my dataframe is cycle8 contain 166 rows and two columns latitude<- seq(31,37,by=0.5) longitude<- seq(33,37,by=

我有一个两列的数据框,第一列是经度,第二列是纬度。我想找到中心单元格的坐标。 e、 g.范围为lat[31.5],lon[33.5],如果两列的第一个值满足此条件,则创建第三列并输入值31.25,创建第四列并输入值33.25

我尝试过嵌套for循环,但它不起作用

# my dataframe is cycle8 contain 166 rows and two columns
latitude<- seq(31,37,by=0.5)
longitude<- seq(33,37,by=0.5)
cycle8$latcenter<- 0
cycle8$loncenter<-0
for (m in 1:nrow(cycle8)) 
{
  for(j in seq_along(latitude))
  {
    for(k in seq_along(longitude))
    {    
      if (cycle8$lat[m]>=j && cycle8$lat[m]<=j+0.5 && cycle8$lon[m]>=k && 
          cycle8$lon[m]<=k+0.5)
      {
        cycle8$latcenter[m]<- j+0.25

        cycle8$loncenter[m]<- k+0.25
      }
    }    
  }
}

下面的代码可以工作并提供所需的结果,但它太长,需要大量的语句输入
我的解决方案避免了for循环、sapply或其他类似函数。代码背后的逻辑如下:因为范围有小数点.50或.00,所以中心值总是.25或.75。这意味着我们只需要替换小数;所有介于.00和.50之间的小数变为.25,而其他小数变为.75

这是代码

# generate data
latitude <- seq(30, 32, .1)
longitude <- seq(30, 32, .1)
cycle8 <- data.frame(latitude, longitude)

# make a function that replaces decimals as explained above
lat_lon <- function(vec){
decimals <- as.character(format(vec, nsmall= 1))
decimals <- as.numeric(gsub("^.*\\.", "", decimals))
decimals <- ifelse(decimals < 5, .25, .75)
values <- as.numeric(gsub("\\..*","",vec)) + as.numeric(decimals)
return(values)
}

# apply function
cycle8$lat_center <- lat_lon(latitude)
cycle8$lon_center <- lat_lon(longitude)

# see results
cycle8
编辑

因为您希望30.00为29.75,30.50为30.25,所以这里有一个编辑。但逻辑仍然是一样的

latitude <- seq(30, 32, .1)
longitude <- seq(30, 32, .1)
cycle8 <- data.frame(latitude, longitude)
lat_lon <- function(vec){
decimals <- as.character(format(vec, nsmall= 1))
decimals <- as.numeric(gsub("^.*\\.", "", decimals))
decimals_new <- ifelse(decimals > 5 | decimals == 0, .75, .25)
values <- as.numeric(gsub("\\..*","",vec)) + as.numeric(decimals_new)
values[decimals == 0] <- values[decimals == 0] - 1
return(values)
}
cycle8$lat_center <- lat_lon(latitude)
cycle8$lon_center <- lat_lon(longitude)
cycle8

在您的示例中,有[31.5]之外的lat值,但预期输出将按照您描述的满足此条件的值进行舍入。所以对我来说,似乎你只是想取整.25?在我的代码中,我添加了数据帧循环8,我有166个纬度值和166个经度值。我想做测距如果那些纬度和经度属于这个范围,那么我想创建一个新的列来包含这个范围的中心值,我只上传了前十行,其余的行包含更多的lon和纬度值,我想检查以下范围lat[31 31.5],[31.5],[32 32.5],[32.5],[32.5 34]等等[36.5 37]类似地,对于lon[33.5]等等,直到[36.5 37]问题更清楚,我将向您解释。lon列的第一个值是33.350407,我想编写代码,检查这个值在这里属于哪个范围[33 33.5]然后把这个范围的中心值放在新的列中,它是33.25不,不是那样,cycle8包含了带小数的lon和lat的值,还有latiteOK的值,我不明白。也许其他人可以帮上忙!无论如何,谢谢你,至少你已经试着帮过忙了。但是我会进一步澄清它。除了这段代码,假设我有一个val第1行中的ue为10.23,我有一个范围[10.5]。问题是检查10.23是否属于该范围。如果是,则创建一个新列,并在其中输入10+10.5/2的值,即10.25,否则检查第二个范围,例如[10.5 11]依此类推。现在移到包含值10.56的第二行,再次检查,直到我们完成第一列的所有行。@Jisika:我的代码将准确返回:round10.23/.25*.25返回10.25。例如,上面的代码应该总是给出您要查找的结果,除非有我不知道的特殊情况。您尝试过吗d观察到任何意外结果?它不起作用,例如,对于值33.57776,您代码的结果为33.5,但我的期望结果应为33.75,因为33.57776属于[33.5 34]
latitude <- seq(30, 32, .1)
longitude <- seq(30, 32, .1)
cycle8 <- data.frame(latitude, longitude)
lat_lon <- function(vec){
decimals <- as.character(format(vec, nsmall= 1))
decimals <- as.numeric(gsub("^.*\\.", "", decimals))
decimals_new <- ifelse(decimals > 5 | decimals == 0, .75, .25)
values <- as.numeric(gsub("\\..*","",vec)) + as.numeric(decimals_new)
values[decimals == 0] <- values[decimals == 0] - 1
return(values)
}
cycle8$lat_center <- lat_lon(latitude)
cycle8$lon_center <- lat_lon(longitude)
cycle8
# The other way of solving this question is 
mydata<- c(35.666,35.4578,35.0, 33.50,32.10)
centered_value <- function(val){ 
                               a<- trunc(val)
                               b<- val %% 1
 c<- ifelse(b/0.5 > 1, a +0.75 , ifelse(b/0.5> 1, a+0.25, ifelse(b/0.5 ==0, a- 
                                                                      0.25,a+0.25)))
                               }
       d<- centered_value(mydata)
       d