减去不同大小的data.frames和data.tables

时间:2015-07-28 14:18:25

标签: r dataframe subtraction

可以使用

data.frames中减去两个相同维度的Rdf1 - df2
data.frames

但我想减去两个不同维度的df1 <- data.frame(V1=1:5) df2 <- data.frame(V1=1:5, V2=6:10) df1-df2 Error in Ops.data.frame(df1, df2) : ‘-’ only defined for equally-sized data frames ,例如

library(data.table)
dt1 <- data.table(V1=1:5)
dt2 <- data.table(V1=1:5, V2=6:10)

dt1-dt2

Error in `[.data.table`(dt1, row(dt2), ) : 
  i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please let datatable-help know if you'd like this, or add your comments to FR #1611.
dt1[row(dt2),]-dt2

这个减法可以使用for循环来实现,但我正在寻找任何已经建立的函数。谢谢

被修改

如果必须减去两个不同维度的data.tables呢?

  $container->getParameter('security.role_hierarchy.roles')

1 个答案:

答案 0 :(得分:3)

我们可以通过使两个数据集具有相同的长度来实现这一点,以便我们可以逐个元素地比较每个数据集。在给定的示例中,'df1'有1列5行,其中'df2'是2列5行。我们的想法是让'df1'有10个元素或2列5行,以匹配'df2'的尺寸。这可以通过rep轻松完成,或者方便的功能是row

  df1[row(df2),]-df2

只是为了让它更清晰

 row(df2)
 #     [,1] [,2]
 #[1,]    1    1
 #[2,]    2    2
 #[3,]    3    3
 #[4,]    4    4
 #[5,]    5    5

给出'df2'每行的行索引。通过做

 df1[row(df2),]
 #[1] 1 2 3 4 5 1 2 3 4 5

我们将每个行元素复制两次。鉴于数据集在列中执行此操作,它发生如下

 df1[c(row(df2)[,1],row(df2)[,2]),]

可以从df2

中扣除
 df1[row(df2),]-df2
 #  V1 V2
 #1  0 -5
 #2  0 -5
 #3  0 -5
 #4  0 -5
 #5  0 -5

正如@David Arenburg所提到的,对于具有多列的两个数据集,这将返回错误的结果。因此,如果您要从多列数据集('df2')中减去'df1'(具有多列)中的单个列,则选择该列并从'df2'中减去可能更为通用(感谢@David)阿伦堡的代码)

 df1$V1-df2
 #  V1 V2
 #1  0 -5
 #2  0 -5
 #3  0 -5
 #4  0 -5
 #5  0 -5

由于循环效应,它起作用,即'V1'列元素将从'df2'的第一列中减去,然后它将再次从第一个元素开始从'df2'的第二列开始减去(假设两个数据集都有相同的数字或行。)

对于带data.table的第二个示例('dt1'的单列),一个选项是

dt1[,rep(names(dt1), ncol(dt2)),with=FALSE]-dt2
#   V1 V1
#1:  0 -5
#2:  0 -5
#3:  0 -5
#4:  0 -5
#5:  0 -5