我正在尝试对R中的数据表的每个单元格执行一个函数,根据此循环的结果创建第二个单元格.例如,假设我有矩阵A
Ad1 Ad2 Ad3 Ad4
AA 6 0 10
AB 7 10 12
AC 0 0 15
Run Code Online (Sandbox Code Playgroud)
而我正在尝试创建Matrix B
Ad1 Ad2 Ad3 Ad4
AA 1 0 1
AB 1 0 1
AC 0 0 1
Run Code Online (Sandbox Code Playgroud)
以某种方式,如果该单元格的值大于0 ,则每个单元格假定值为1 ,并且列减去该单元格的总和也大于0.
例如,AA~Ad2为6,列的总和为7(6 + 7 + 0 - 6); 然后矩阵B中的AA~Ad2假定值为1.
有没有办法在不执行循环的情况下执行此操作?我设法用一个循环来做到这一点,但它花了太长时间:
A = read.table(text="Ad1 Ad2 Ad3 Ad4
AA 6 0 10
AA 7 10 12
AA 0 0 15", header=TRUE)
B = read.table(text="Ad1 Ad2 Ad3 Ad4
AA 0 0 0
AA 0 0 0
AA 0 0 0", header=TRUE)
for (i in 1:nrow(B)) {
for (j in 2:ncol(B)) {
if ((sum(A[,j], na.rm = T) - ifelse(is.na(A[i,j]), 0, A[i,j]))> 0 &
ifelse(is.na(A[i,j]), 0, A[i,j]) > 0 )
{B[i,j] <- 1}
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以通过创建两个逻辑矩阵而无需循环来执行此操作-1)检查数字列值是否大于0(A[-1] > 0),2)检查列总和与列值的差异是否也大于0.如果两者都是他们是TRUE(&条件),将逻辑矩阵转换为二进制(+)并将其分配给数据集的子集(A[-1])
A[-1] <- +(colSums(A[-1])[col(A[-1])]-A[-1]>0 & A[-1] > 0)
A
# Ad1 Ad2 Ad3 Ad4
#1 AA 1 0 1
#2 AB 1 1 1
#3 AC 0 0 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |