如何在 R 中的二进制矩阵中计算
How to compute in a binary matrix in R
这是我无法解决的问题。
假设我们有如下代码:
## A data frame named a
a <- data.frame(A = c(0,0,1,1,1), B = c(1,0,1,0,0), C = c(0,0,1,1,0), D = c(0,0,1,1,0), E = c(0,1,1,0,1))
## 1st function calculates all the combinaisons of colnames of a and the output is a character vector named item2
items2 <- c()
countI <- 1
while(countI <= ncol(a)){
for(i in countI){
countJ <- countI + 1
while(countJ <= ncol(a)){
for(j in countJ){
items2 <- c(items2, paste(colnames(a[i]), colnames(a[j]), collapse = '', sep = ""))
}
countJ <- countJ + 1
}
countI <- countI + 1
}
}
这是我试图解决的代码(输出是一个名为 count_1 的数字向量):
## 2nd function
colnames(a) <- NULL ## just for facilitating the calculation
count_1 <- numeric(ncol(a)*2)
countI <- 1
while(countI <= ncol(a)){
for(i in countI){
countJ <- countI + 1
while(countJ <= ncol(a)){
for(j in countJ){
s <- a[, i]
p <- a[, j]
count_1[i*2] <- as.integer(s[i] == p[j] & s[i] == 1)
}
countJ <- countJ + 1
}
countI <- countI + 1
}
}
但是当我在RStudio Console中执行这段代码时,返回了一个非预期的结果!:
count_1
[1] 0 0 0 0 0 1 0 1 0 0
但是,我期待以下结果:
count_1
[1] 1 2 2 2 1 1 1 1 2 1
您可以访问以下URL,您可以在其中找到 Dropbox 上的图像以获取详细说明。
https://www.dropbox.com/s/5ylt8h8wx3zrvy7/IMAG1074.jpg?dl=0
我会尝试解释更多,
我发布第一个函数(代码)只是为了向您展示我正在寻找的东西,这只是一个例子。
我想从第二个函数(代码)中得到的是计算每行中数字 1(首先我们输入 counter = 0
)的出现次数(而每一行两列(例如 AB)必须在两列中都等于 1,表示 counter = counter + 1
)我们继续将每一列与所有其他列(AC、AD、AE、BC、BD、BE、CD ,CE,然后是 DE),组合是 n!/2!(n-2)!
,这意味着例如如果我有以下数据框:
一个=
A B C D E
0 1 0 0 0
0 0 0 0 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 1
然后,通过组合前两列,每一行的数字1出现的次数如下:(注意我把colnames(a) <- NULL
只是为了方便工作,更清楚)
0 1 0 0 0
0 0 0 0 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 1
### Example 1: #####################################################
所以我从这里开始(对于 A 和 B (AB) 列)
s <- a[, i]
## s is equal to
## [1] 0 0 1 1 1
p <- a[, j]
## p is equal to
## [1] 1 0 1 0 0
然后我将在两个向量中查找数字 1 的出现情况,条件是它必须相同,即 a[, i] == 1 && a[, j] == 1 && a[, i] == a[, j]
,对于此示例数值向量将是 [1] 1
### Example 2: #####################################################
我从这里输入(对于 A 和 D 列 (AD))
s <- a[, i]
## s is equal to
## [1] 0 0 1 1 1
p <- a[, j]
## p is equal to
## [1] 0 0 1 1 0
然后我将在两个向量中查找数字 1 的出现情况,条件是它必须相同,即 a[, i] == 1 && a[, j] == 1 && a[, i] == a[, j]
,对于此示例数值向量将是 [1] 2
等等,
我将有一个名为 count_1
的数值向量,等于:
[1] 1 2 2 2 1 1 1 1 2 1
而 count_1
的每个索引都是其他列的每个列的组合(没有数据框的名称)
AB AC AD AE BC BD BE CD CE DE
1 2 2 2 1 1 1 1 2 1
完全不清楚你在追求什么。
至于第一个代码块,那是一些丑陋的 R 编码,涉及一大堆不必要的 while
/for
循环。
您可以在一行中得到相同的结果 items2
。
items2 <- sort(toupper(unlist(sapply(1:4, function(i)
sapply(5:(i+1), function(j)
paste(letters[i], letters[j], sep = ""))))));
items2;
# [1] "AB" "AC" "AD" "AE" "BC" "BD" "BE" "CD" "CE" "DE"
关于第二个代码块,请解释您要计算的内容。这些 while
/for
循环很可能与第一种情况一样没有必要。
更新
请注意,这是基于 post 开头定义的 a
。您的预期输出基于不同的 a
,您进一步向下更改 post。
不需要for
/while
循环,两个“函数”都可以写在两个一行中。
# Your sample dataframe a
a <- data.frame(A = c(0,0,1,1,1), B = c(1,0,1,0,0), C = c(0,0,1,1,0), D = c(0,0,1,1,0), E = c(0,1,1,0,1))
# Function 1
items2 <- toupper(unlist(sapply(1:(ncol(a) - 1), function(i) sapply(ncol(a):(i+1), function(j)
paste(letters[i], letters[j], sep = "")))));
# Function 2
count_1 <- unlist(sapply(1:(ncol(a) - 1), function(i) sapply(ncol(a):(i+1), function(j)
sum(a[, i] + a[, j] == 2))));
# Add names and sort
names(count_1) <- items2;
count_1 <- count_1[order(names(count_1))];
# Output
count_1;
#AB AC AD AE BC BD BE CD CE DE
# 1 2 2 2 1 1 1 2 1 1
这是我无法解决的问题。
假设我们有如下代码:
## A data frame named a
a <- data.frame(A = c(0,0,1,1,1), B = c(1,0,1,0,0), C = c(0,0,1,1,0), D = c(0,0,1,1,0), E = c(0,1,1,0,1))
## 1st function calculates all the combinaisons of colnames of a and the output is a character vector named item2
items2 <- c()
countI <- 1
while(countI <= ncol(a)){
for(i in countI){
countJ <- countI + 1
while(countJ <= ncol(a)){
for(j in countJ){
items2 <- c(items2, paste(colnames(a[i]), colnames(a[j]), collapse = '', sep = ""))
}
countJ <- countJ + 1
}
countI <- countI + 1
}
}
这是我试图解决的代码(输出是一个名为 count_1 的数字向量):
## 2nd function
colnames(a) <- NULL ## just for facilitating the calculation
count_1 <- numeric(ncol(a)*2)
countI <- 1
while(countI <= ncol(a)){
for(i in countI){
countJ <- countI + 1
while(countJ <= ncol(a)){
for(j in countJ){
s <- a[, i]
p <- a[, j]
count_1[i*2] <- as.integer(s[i] == p[j] & s[i] == 1)
}
countJ <- countJ + 1
}
countI <- countI + 1
}
}
但是当我在RStudio Console中执行这段代码时,返回了一个非预期的结果!:
count_1
[1] 0 0 0 0 0 1 0 1 0 0
但是,我期待以下结果:
count_1
[1] 1 2 2 2 1 1 1 1 2 1
您可以访问以下URL,您可以在其中找到 Dropbox 上的图像以获取详细说明。 https://www.dropbox.com/s/5ylt8h8wx3zrvy7/IMAG1074.jpg?dl=0
我会尝试解释更多,
我发布第一个函数(代码)只是为了向您展示我正在寻找的东西,这只是一个例子。
我想从第二个函数(代码)中得到的是计算每行中数字 1(首先我们输入 counter = 0
)的出现次数(而每一行两列(例如 AB)必须在两列中都等于 1,表示 counter = counter + 1
)我们继续将每一列与所有其他列(AC、AD、AE、BC、BD、BE、CD ,CE,然后是 DE),组合是 n!/2!(n-2)!
,这意味着例如如果我有以下数据框:
一个=
A B C D E
0 1 0 0 0
0 0 0 0 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 1
然后,通过组合前两列,每一行的数字1出现的次数如下:(注意我把colnames(a) <- NULL
只是为了方便工作,更清楚)
0 1 0 0 0
0 0 0 0 1
1 1 1 1 1
1 0 0 1 0
1 0 1 0 1
### Example 1: #####################################################
所以我从这里开始(对于 A 和 B (AB) 列)
s <- a[, i]
## s is equal to
## [1] 0 0 1 1 1
p <- a[, j]
## p is equal to
## [1] 1 0 1 0 0
然后我将在两个向量中查找数字 1 的出现情况,条件是它必须相同,即 a[, i] == 1 && a[, j] == 1 && a[, i] == a[, j]
,对于此示例数值向量将是 [1] 1
### Example 2: #####################################################
我从这里输入(对于 A 和 D 列 (AD))
s <- a[, i]
## s is equal to
## [1] 0 0 1 1 1
p <- a[, j]
## p is equal to
## [1] 0 0 1 1 0
然后我将在两个向量中查找数字 1 的出现情况,条件是它必须相同,即 a[, i] == 1 && a[, j] == 1 && a[, i] == a[, j]
,对于此示例数值向量将是 [1] 2
等等,
我将有一个名为 count_1
的数值向量,等于:
[1] 1 2 2 2 1 1 1 1 2 1
而 count_1
的每个索引都是其他列的每个列的组合(没有数据框的名称)
AB AC AD AE BC BD BE CD CE DE
1 2 2 2 1 1 1 1 2 1
完全不清楚你在追求什么。
至于第一个代码块,那是一些丑陋的 R 编码,涉及一大堆不必要的 while
/for
循环。
您可以在一行中得到相同的结果 items2
。
items2 <- sort(toupper(unlist(sapply(1:4, function(i)
sapply(5:(i+1), function(j)
paste(letters[i], letters[j], sep = ""))))));
items2;
# [1] "AB" "AC" "AD" "AE" "BC" "BD" "BE" "CD" "CE" "DE"
关于第二个代码块,请解释您要计算的内容。这些 while
/for
循环很可能与第一种情况一样没有必要。
更新
请注意,这是基于 post 开头定义的 a
。您的预期输出基于不同的 a
,您进一步向下更改 post。
不需要for
/while
循环,两个“函数”都可以写在两个一行中。
# Your sample dataframe a
a <- data.frame(A = c(0,0,1,1,1), B = c(1,0,1,0,0), C = c(0,0,1,1,0), D = c(0,0,1,1,0), E = c(0,1,1,0,1))
# Function 1
items2 <- toupper(unlist(sapply(1:(ncol(a) - 1), function(i) sapply(ncol(a):(i+1), function(j)
paste(letters[i], letters[j], sep = "")))));
# Function 2
count_1 <- unlist(sapply(1:(ncol(a) - 1), function(i) sapply(ncol(a):(i+1), function(j)
sum(a[, i] + a[, j] == 2))));
# Add names and sort
names(count_1) <- items2;
count_1 <- count_1[order(names(count_1))];
# Output
count_1;
#AB AC AD AE BC BD BE CD CE DE
# 1 2 2 2 1 1 1 2 1 1