对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,因为我的数据框很大。这些是地理坐标,用于计算特定世界气候下的产量