减去不同大小的 data.frames 和 data.tables
Subtracting data.frames and data.tables of different sizes
可以使用
在 R
中减去两个相同尺寸的 data.frames
df1 - 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
这个减法可以使用 for 循环来实现,但我正在寻找任何已经建立的函数。谢谢
已编辑
如果必须减去两个不同维度的 data.tables 怎么办?
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
我们可以通过使两个数据集具有相同的长度来做到这一点,这样我们就可以逐个元素地比较每个数据集。在给定的示例中 '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 所提到的,对于具有多列的两个数据集,这将 return 错误的结果。因此,如果您要从多列数据集 ('df2') 中减去 'df1'(具有多列)中的单个列,则选择该列并从 'df2' 中减去可能会更多一般(感谢@David Arenburg 的代码)
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
可以使用
在R
中减去两个相同尺寸的 data.frames
df1 - 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
这个减法可以使用 for 循环来实现,但我正在寻找任何已经建立的函数。谢谢
已编辑
如果必须减去两个不同维度的 data.tables 怎么办?
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
我们可以通过使两个数据集具有相同的长度来做到这一点,这样我们就可以逐个元素地比较每个数据集。在给定的示例中 '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 所提到的,对于具有多列的两个数据集,这将 return 错误的结果。因此,如果您要从多列数据集 ('df2') 中减去 'df1'(具有多列)中的单个列,则选择该列并从 'df2' 中减去可能会更多一般(感谢@David Arenburg 的代码)
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