R 如何进行行减法并将特定数字替换为零?

R 如何进行行减法并将特定数字替换为零?,r,dataframe,R,Dataframe,步骤1:我有一个简化的数据帧,如下所示: df1 = data.frame (B=c(1,0,1), C=c(1,1,0) , D=c(1,0,1), E=c(1,1,0), F=c(0,0,1) , G=c(0,1,0), H=c(0,0,1), I=c(0,1,0)) B C D E F G H I 1 1 1 1 1 0 0 0 0 2 0 1 0 1 0 1 0 1 3 1 0 1 0 1 0 1 0 步骤2:我想做行减法,即(第1行-第2行),(第1行-第3行)和(第2

步骤1:我有一个简化的数据帧,如下所示:

df1 = data.frame (B=c(1,0,1), C=c(1,1,0)
  , D=c(1,0,1), E=c(1,1,0), F=c(0,0,1)
  , G=c(0,1,0), H=c(0,0,1), I=c(0,1,0))

  B C D E F G H I
1 1 1 1 1 0 0 0 0
2 0 1 0 1 0 1 0 1
3 1 0 1 0 1 0 1 0
步骤2:我想做行减法,即(第1行-第2行),(第1行-第3行)和(第2行-第3行)

步骤3:将所有-1替换为0

row1-row2   1   0   1   0   0   0   0   0
row1-row3   0   1   0   1   0   0   0   0
row2-row3   0   1   0   1   0   1   0   1
你能教我怎么做吗?

>df2 df2
> df2 <- rbind(df1[1,]-df1[2,], df1[1,]-df1[3,], df1[2,]-df1[3,])
> df2
    B C  D E  F  G  H  I
1   1 0  1 0  0 -1  0 -1
2   0 1  0 1 -1  0 -1  0
21 -1 1 -1 1 -1  1 -1  1

> df2[df2==-1] <- 0
> df2
   B C D E F G H I
1  1 0 1 0 0 0 0 0
2  0 1 0 1 0 0 0 0
21 0 1 0 1 0 1 0 1
B C D E F G H I 1 1 0 1 0 0 -1 0 -1 2 0 1 0 1 -1 0 -1 0 21 -1 1 -1 1 -1 1 -1 1 >df2[df2==-1]df2 B C D E F G H I 1 1 0 1 0 0 0 0 0 2 0 1 0 1 0 0 0 0 21 0 1 0 1 0 1 0 1
如果要将行的名称更改为示例中的名称,请执行以下操作:

> rownames(df2) <- c('row1-row2', 'row1-row3', 'row2-row3')
> df2
          B C D E F G H I
row1-row2 1 0 1 0 0 0 0 0
row1-row3 0 1 0 1 0 0 0 0
row2-row3 0 1 0 1 0 1 0 1
>行名(df2)df2
B C D E F G H I
第1-2行1 0 1 0 0 0 0 0 0 0
第1-3行0 1 0 1 0 0 0 0 0 0 0
第2-3行0 1 0 1 0 1 01
最后,如果事先不知道行数,则应使用以下方法:

df1 = data.frame (B=c(1,0,1), C=c(1,1,0), D=c(1,0,1), E=c(1,1,0), F=c(0,0,1), G=c(0,1,0), H=c(0,0,1), I=c(0,1,0))

n <- length(df1[,1])
ret <- data.frame()
for (i in 1:(n-1)) {
  for (j in (i+1):n) {
    diff <- df1[i,] - df1[j,]
    rownames(diff) <- paste('row', i, '-row', j, sep='')
    ret <- rbind(ret, diff)
  }
}
ret[ret==-1] <- 0
print(ret)
df1=data.frame(B=c(1,0,1),c=c(1,1,0),D=c(1,0,1),E=c(1,1,0),F=c(0,0,1),G=c(0,1,0),H=c(0,0,1,1),I=c(0,1,0))

n我喜欢使用
plyr
库进行类似的操作,使用
combn
函数生成所有可能的行/列对

require(plyr)
combos <- combn(nrow(df1), 2)

adply(combos, 2, function(x) {
  out <- data.frame(df1[x[1] , ] - df1[x[2] , ])
  out[out == -1] <- 0
  return(out)
  }
)
如有必要,您可以删除第一列,plyr自动为您吐出

类似问题:


为了记录在案,我会这样做:

cmb <- combn(seq_len(nrow(df1)), 2)
out <- df1[cmb[1,], ] - df1[cmb[2,], ]
out[out < 0] <- 0
rownames(out) <- apply(cmb, 2, 
                       function(x) paste("row", x[1], "-row", x[2], sep = ""))

它是完全矢量化的,并利用索引扩展/提取逐行操作所需的
df1
元素。

感谢您的宝贵建议。这段代码用于测试作业,但由于我的数据文件非常大,adply的使用似乎对内存要求非常高,它在我们的超级计算机设备中的等待时间相当长。你能给我更多的指导吗?谢谢你的建议。这段代码用于测试作业,但由于我的数据文件非常大,使用for循环似乎对内存要求非常高,它在我们的超级计算机设备中的等待时间相当长。你介意给我一些指导如何克服这一点吗?有点恼人的是,我在几周前回答了你几乎相同的问题,你接受了这个问题:
  X1 B C D E F G H I
1  1 1 0 1 0 0 0 0 0
2  2 0 1 0 1 0 0 0 0
3  3 0 1 0 1 0 1 0 1
cmb <- combn(seq_len(nrow(df1)), 2)
out <- df1[cmb[1,], ] - df1[cmb[2,], ]
out[out < 0] <- 0
rownames(out) <- apply(cmb, 2, 
                       function(x) paste("row", x[1], "-row", x[2], sep = ""))
> out
          B C D E F G H I
row1-row2 1 0 1 0 0 0 0 0
row1-row3 0 1 0 1 0 0 0 0
row2-row3 0 1 0 1 0 1 0 1