逐行乘以数据框
输入文件:
df1 <- data.frame(row.names=c("w","x","y","z"),
A=c(0,0,0,0),
B=c(0,1,0,0),
C=c(1,0,1,0),
D=c(1,1,1,1))
A B C D
w 0 0 1 1
x 0 1 0 1
y 0 0 1 1
z 0 0 0 1
我想应用一个方程,即将行 w 乘以行 x 以获得 wx 对的成对值,如下所示:
A B C D
w 0 0 1 1
X x 0 1 0 1
--------------
wx 0 0 0 1
获得 wx、wy、wy、wz、xy、xz、yz 的逐行分析。并生成一个包含 6 列的新数据框(两行名称后跟相乘的值)。
这就是
w x 0 0 0 1
w y 0 0 1 1
w z 0 0 0 1
x y 0 0 0 1
x z 0 0 0 1
y z 0 0 0 1
谢谢。
Input file:
df1 <- data.frame(row.names=c("w","x","y","z"),
A=c(0,0,0,0),
B=c(0,1,0,0),
C=c(1,0,1,0),
D=c(1,1,1,1))
A B C D
w 0 0 1 1
x 0 1 0 1
y 0 0 1 1
z 0 0 0 1
I want to apply an equation i.e. multiply row w to row x to get the pairwise value for w-x pair, as follows:
A B C D
w 0 0 1 1
X x 0 1 0 1
--------------
wx 0 0 0 1
to get row-wise analysis for w-x, w-y, w-y, w-z, x-y, x-z, y-z. and generate a new dataframe with 6 columns (two row names followed by the multiplied values).
That's
w x 0 0 0 1
w y 0 0 1 1
w z 0 0 0 1
x y 0 0 0 1
x z 0 0 0 1
y z 0 0 0 1
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您不希望结果对象中出现组合名称,那么我们可以结合 @DWin 和 @Owen 的答案的元素,以提供真正的矢量化方法来解决问题。 (您可以将组合名称添加为行名称,并在最后添加一个额外步骤。)
首先,数据:
采用 @DWin 的答案中的
combn()
想法,但在行上使用它dat
的索引:combs
的行现在对我们想要相乘的dat
行进行索引:现在我们取@Owen 提出的想法,即
dat[i, ] * dat[j, ]
其中i
和j
是梳子
分别。我们使用 data.matrix() 转换为矩阵,因为这对于大型对象会更有效,但代码也可以将 dat 作为数据框使用。它产生:
要了解它是如何工作的,请注意
mat[combs[k,], ]
产生一个矩阵,其中各行按组合指定的顺序重复:要准确获取 OP 发布的内容,我们可以使用第二个
combn()
调用来修改行名称:If you don't want the combo names in the resulting object, then we can combine elements of @DWin's and @Owen's Answers to provide a truly vectorised approach to the problem. (You can add the combination names as row names with one extra step at the end.)
First, the data:
Take the
combn()
idea from @DWin's Answer but use it on the row indices ofdat
:The rows of
combs
now index the rows ofdat
that we want to multiply together:Now we take the idea @Owen showed, namely
dat[i, ] * dat[j, ]
withi
andj
being the first and second rows ofcombs
respectively. We convert to a matrix withdata.matrix()
as this will be more efficient for large objects, but the code will work withdat
as a data frame too.which produces:
To see how this works, note that
mat[combs[k,], ]
produces a matrix with various rows repeated in the order specified by the combinations:To get exactly what the OP posted, we can modify the rownames using a second
combn()
call:所以最终的解决方案:
如果将组合转换为数据帧,您还可以将 cbindmatrix 作为“数字”类型:
So the final solution:
If you convert the combos to a dataframe you would also be able to cbindmatrix as type "numeric":
如果你想乘以行,我建议转换为矩阵:
你想要的具体结果可以通过
plyr
获得,抱歉,其中一部分看起来有点神奇 - data.frames 并不是真正的意思成为“行状”。这些行
传递 6 列:a 和 b 表示名称,连接(使用
c
)到相乘的行。If you want to multiply rows, I recommend converting to a matrix:
The specific result you want you could get with
plyr
,Sorry part of that looks a little magical -- data.frames aren't really meant to be "row like". The lines
pass in the 6 columns: a and b for the names, concatenated (with
c
) to the multiplied row.一种更短的方法(我认为)使用令人惊叹的 plyr 包
你的 data.frame
和你的结果:)
A shorter way (I think) using the amazing plyr package
Your data.frame
And your result :)