Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对R中给定2个约束的某些行求和_R_Conditional Statements - Fatal编程技术网

对R中给定2个约束的某些行求和

对R中给定2个约束的某些行求和,r,conditional-statements,R,Conditional Statements,我试图用以下约束编写一个条件语句。下面是一个示例数据框,显示了我遇到的问题 Row <- c(1,2,3,4,5,6,7) La <- c(51.25,51.25,51.75,53.25,53.25,54.25,54.25) Lo <- c(128.25,127.75,127.25,119.75,119.25,118.75,118.25) Y <- c(5,10,2,4,5,7,9) Cl <- c("EF","EF","EF","EF","NA","NA","CE

我试图用以下约束编写一个条件语句。下面是一个示例数据框,显示了我遇到的问题

Row <- c(1,2,3,4,5,6,7)
La <- c(51.25,51.25,51.75,53.25,53.25,54.25,54.25)
Lo <- c(128.25,127.75,127.25,119.75,119.25,118.75,118.25)
Y <- c(5,10,2,4,5,7,9)
Cl <- c("EF","EF","EF","EF","NA","NA","CE")     

d <- data.frame(Row,La,Lo,Y,Cl)

  Row    La     Lo  Y Cl
1   1 51.25 128.25  5 EF
2   2 51.25 127.75 10 EF
3   3 51.75 127.25  2 EF
4   4 53.25 119.75  4 EF
5   5 53.25 119.25  5 NA
6   6 54.25 118.75  7 NA
7   7 55.25 118.25  9 CE

Row如果您可以为数据中所有(La,Lo)行之间的距离制作一些距离矩阵
m
,则可以使用此方法。我使用
dist
的输出,即欧几里得距离。选择距离最小的行,如果最小距离由>1行共享,则选择最早的此类行

w <- which(is.na(d$Cl))
m <- as.matrix(dist(d[c('La', 'Lo')]))
m[row(m) %in% w] <- NA
d$g <- replace(seq(nrow(d)), w, apply(m[,w], 2, which.min))

library(dplyr)

d %>% 
  group_by(g) %>% 
  summarise(La = La[!is.na(Cl)],
            Lo = Lo[!is.na(Cl)],
            Y = sum(Y), 
            Cl = Cl[!is.na(Cl)]) %>% 
  select(-g)

# # A tibble: 5 x 4
#      La    Lo     Y Cl   
#   <dbl> <dbl> <dbl> <fct>
# 1  51.2  128.     5 EF   
# 2  51.2  128.    10 EF   
# 3  51.8  127.     2 EF   
# 4  53.2  120.     9 EF   
# 5  54.2  118.    16 CE   

w如果您可以为数据中所有(La,Lo)行之间的距离制作一些距离矩阵
m
,那么这里有一种方法可以使用。我使用
dist
的输出,即欧几里得距离。选择距离最小的行,如果最小距离由>1行共享,则选择最早的此类行

w <- which(is.na(d$Cl))
m <- as.matrix(dist(d[c('La', 'Lo')]))
m[row(m) %in% w] <- NA
d$g <- replace(seq(nrow(d)), w, apply(m[,w], 2, which.min))

library(dplyr)

d %>% 
  group_by(g) %>% 
  summarise(La = La[!is.na(Cl)],
            Lo = Lo[!is.na(Cl)],
            Y = sum(Y), 
            Cl = Cl[!is.na(Cl)]) %>% 
  select(-g)

# # A tibble: 5 x 4
#      La    Lo     Y Cl   
#   <dbl> <dbl> <dbl> <fct>
# 1  51.2  128.     5 EF   
# 2  51.2  128.    10 EF   
# 3  51.8  127.     2 EF   
# 4  53.2  120.     9 EF   
# 5  54.2  118.    16 CE   

w如果NA行在Lo值方面更接近一行,而在La值方面更接近另一行,该怎么办?如果有两行同样接近的Lo和La值怎么办?好问题!我没有想到这种可能性。如果是这种情况,请选择使用更接近的La求和。如果有两个同样接近的值,则求和到较低的值La。如果NA行在Lo值方面更接近一行,而在La值方面更接近另一行,该怎么办?如果有两行同样接近的Lo和La值怎么办?好问题!我没有想到这种可能性。如果是这种情况,选择用更接近的La求和。如果有两个同样接近的值,求和到较低的值La。我想你也可以用
distm
i1来做这件事。是的,如果这些是地理坐标,可能最好使用
distm
,而
dist
/
distm
中的
i1
索引也比这个答案中的计算全距离矩阵更有效。我正在研究它,然后找到了你的答案。所以,这几乎是相似的。你可以添加它是的,我刚刚试着运行@IceCreamToucan的代码,但是我的计算机不会计算dist,因为我的数据框太大了。这些是地理坐标,在某些世界气候下计算产量。我想你也可以用
distm
i1做这件事。是的,如果这些是地理坐标,可能最好使用
distm
,而
dist
/
distm
中的
i1
索引也比这个答案中的计算全距离矩阵更有效。我正在研究它,然后找到了你的答案。所以,这几乎是相似的。你可以加上它是的,我只是试着运行@IceCreamToucan的代码,我的计算机不会计算dist,因为我的数据框很大。这些是地理坐标,用于计算特定世界气候下的产量