R 中的逻辑运算符 TRUE/FALSE
logical operator TRUE/FALSE in R
我编写了一个简单的函数来生成输入(向量)的所有组合。这里的输入向量基本上是 4 个坐标 (x, y) 的序列,如函数内部提到的 a、b、c 和 d。
intervals<-function(x1,y1,x2,y2,x3,y3,x4,y4){
a<-c(x1,y1)
b<-c(x2,y2)
c<-c(x3,y3)
d<-c(x4,y4)
union<-expand.grid(a,b,c,d)
union
}
intervals(2,10,3,90,6,50,82,7)
> intervals(2,10,3,90,6,50,82,7)
Var1 Var2 Var3 Var4
1 2 3 6 82
2 10 3 6 82
3 2 90 6 82
4 10 90 6 82
5 2 3 50 82
6 10 3 50 82
7 2 90 50 82
8 10 90 50 82
9 2 3 6 7
10 10 3 6 7
11 2 90 6 7
12 10 90 6 7
13 2 3 50 7
14 10 3 50 7
15 2 90 50 7
16 10 90 50 7
>
现在我想为给定输出的每一行查找(x 的最大值)和(y 的最小值)。例如。第 2 行:我们有 4 个值(10、3、6、82)。这里 (3,6,82) 来自 x (x2,x3,x4) 而 10 基本上来自 y (y1)。因此x的最大值是82,y的最小值是10.
所以我想要的是每行的两个值。
我实际上不知道如何处理这种逻辑命令。有什么想法或建议吗?
您可以将 x
和 y
向量分别传递给函数。使用 expand.grid
创建向量的所有组合,并从每一行中获取 x
的 max
和 y
的 min
。
intervals<-function(x, y){
tmp <- do.call(expand.grid, rbind.data.frame(x, y))
names(tmp) <- paste0('col', seq_along(tmp))
result <- t(apply(tmp, 1, function(p) {
suppressWarnings(c(max(p[p %in% x]), min(p[p %in% y])))
}))
result[is.infinite(result)] <- NA
result <- as.data.frame(result)
names(result) <- c('max_x', 'min_x')
result
}
intervals(c(2,3,6,82), c(10, 90, 50, 7))
# max_x min_x
#1 82 NA
#2 82 10
#3 82 90
#4 82 10
#5 82 50
#6 82 10
#7 82 50
#8 82 10
#9 6 7
#10 6 7
#11 6 7
#12 6 7
#13 3 7
#14 3 7
#15 2 7
#16 NA 7
我编写了一个简单的函数来生成输入(向量)的所有组合。这里的输入向量基本上是 4 个坐标 (x, y) 的序列,如函数内部提到的 a、b、c 和 d。
intervals<-function(x1,y1,x2,y2,x3,y3,x4,y4){
a<-c(x1,y1)
b<-c(x2,y2)
c<-c(x3,y3)
d<-c(x4,y4)
union<-expand.grid(a,b,c,d)
union
}
intervals(2,10,3,90,6,50,82,7)
> intervals(2,10,3,90,6,50,82,7)
Var1 Var2 Var3 Var4
1 2 3 6 82
2 10 3 6 82
3 2 90 6 82
4 10 90 6 82
5 2 3 50 82
6 10 3 50 82
7 2 90 50 82
8 10 90 50 82
9 2 3 6 7
10 10 3 6 7
11 2 90 6 7
12 10 90 6 7
13 2 3 50 7
14 10 3 50 7
15 2 90 50 7
16 10 90 50 7
>
现在我想为给定输出的每一行查找(x 的最大值)和(y 的最小值)。例如。第 2 行:我们有 4 个值(10、3、6、82)。这里 (3,6,82) 来自 x (x2,x3,x4) 而 10 基本上来自 y (y1)。因此x的最大值是82,y的最小值是10.
所以我想要的是每行的两个值。
我实际上不知道如何处理这种逻辑命令。有什么想法或建议吗?
您可以将 x
和 y
向量分别传递给函数。使用 expand.grid
创建向量的所有组合,并从每一行中获取 x
的 max
和 y
的 min
。
intervals<-function(x, y){
tmp <- do.call(expand.grid, rbind.data.frame(x, y))
names(tmp) <- paste0('col', seq_along(tmp))
result <- t(apply(tmp, 1, function(p) {
suppressWarnings(c(max(p[p %in% x]), min(p[p %in% y])))
}))
result[is.infinite(result)] <- NA
result <- as.data.frame(result)
names(result) <- c('max_x', 'min_x')
result
}
intervals(c(2,3,6,82), c(10, 90, 50, 7))
# max_x min_x
#1 82 NA
#2 82 10
#3 82 90
#4 82 10
#5 82 50
#6 82 10
#7 82 50
#8 82 10
#9 6 7
#10 6 7
#11 6 7
#12 6 7
#13 3 7
#14 3 7
#15 2 7
#16 NA 7