引用一个数据帧以对另一个数据帧执行分析

时间:2015-09-25 05:19:07

标签: r dataframe

我有一个数据框,我们称之为标题:

titles <- data.frame(V1=c("A", "B", "A", "B", "A", "A"))

我有另一个名为stuff的数据框:

stuff <- data.frame(V1=c(1,2,3,4,5,6),
                    V2=c(10,20,30,40,50,60),
                    V3=c(1,3,5,7,9,11),
                    V4=c(2,4,6,8,10,12),
                    V5=c(9,8,7,6,5,4))

我想迭代,以便在每一列中,我将所有与A对应的行相乘,并将与B对应的行中的所有值相乘

所以基本上......

对于&#34;东西&#34;中的V1,我会乘以(1 * 3 * 5 * 6),因为它们对应于A

对于&#34;东西&#34;中的V1,我会乘以(2 * 4),因为它们对应于B

我想在apply语句中的Stuff中为每一列执行此操作并输出结果。帮助

3 个答案:

答案 0 :(得分:4)

一气呵成:

sapply(split(stuff, titles$V1), sapply, prod)
#        A   B
#V1     90   8
#V2 900000 800
#V3    495  21
#V4   1440  32
#V5   1260  48

甚至:

by(stuff, titles$V1, sapply, prod)
#titles$V1: A
#    V1     V2     V3     V4     V5 
#    90 900000    495   1440   1260 
#---------------------------------------
#titles$V1: B
# V1  V2  V3  V4  V5 
#  8 800  21  32  48 

答案 1 :(得分:3)

对于“A”行,我们可以使用

sapply(1:ncol(stuff), function(x) prod(stuff[titles$V1=="A",x]))
#[1]     90 900000    495   1440   1260

,因此,对于“B”行

sapply(1:ncol(stuff), function(x) prod(stuff[titles$V1=="B",x]))
#[1]   8 800  21  32  48

答案 2 :(得分:2)

使用data.table的选项。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(stuff)),按&#39; V1&#39;分组。在标题&#39;中的列,我们在Data.table(lapply(..)的子集上循环(.SD)并进行乘法(prod)。

library(data.table)
setDT(stuff)[, lapply(.SD, prod), by = .(titles[['V1']])]
#   titles V1     V2  V3   V4   V5
#1:      A 90 900000 495 1440 1260
#2:      B  8    800  21   32   48

使用dplyrsummarise_each

的类似选项
library(dplyr)
stuff %>% 
      group_by(title=titles[['V1']])  %>%
      summarise_each(funs(prod))
#   title    V1     V2    V3    V4    V5
#   (fctr) (dbl)  (dbl) (dbl) (dbl) (dbl)
#1      A    90 900000   495  1440  1260
#2      B     8    800    21    32    48