我有一个数据框,我们称之为标题:
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中为每一列执行此操作并输出结果。帮助
答案 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
使用dplyr
和summarise_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