【发布时间】:2014-04-13 00:25:48
【问题描述】:
我正在努力寻找解决以下问题的有效解决方案:
我有一个大约 8 列和 80000 行的大型操纵数据框,通常包含多种数据类型。 如果满足大型数据框的条件,我想创建一个包含一列总和的新数据框。
想象一下原始数据框的头部是这样的。 $years.raw 列表示公司测量了 x 年的数据。
> cbind(company.raw,years.raw,source,amount.inkg)
company.raw years.raw source amount.inkg
[1,] "C1" "1" "Ink" "5"
[2,] "C1" "1" "Recycling" "2"
[3,] "C2" "1" "Coffee" "10"
[4,] "C2" "1" "Combusted" "15"
[5,] "C2" "2" "Printer" "14"
[6,] "C2" "2" "Tea" "18"
我现在需要做的是创建一个新的数据框,它根据某些字符串元素为每家公司和每年汇总列 $amount.inkg 的值。 我将字符串元素保存在下面的三个向量中。字符串元素是原始数据框中 $source 列的一部分。
> vector1 <- c("Tea","Coffee")
> vector2 <- c("Ink","Printer")
> vector3 <- c("Recycling","Combusted")
首选数据框将如下所示:
Company Year amount.vector1 amount.vector 2 amount.vector 3
C1 1 0 5 2
C2 1 10 0 15
C2 2 18 14 0
$amount.vector1 的一般方法是: 总结每家公司和每年的列 $amount.inkg 的值,其中原始数据框列 $source== vector1 的字符串元素。 列 $amount.vector2 相同,只是元素当然不同。
如果没有可用的值,则应添加“0”而不是 NA 错误。 这需要对包含大约 250 家公司的整个原始数据框进行,每家公司的数据为 1:8(差异很大)。
编辑:对于数据框,我需要每年每公司一行。
C1 Year 1
C1 Year 2
C1 Year 3
C2 Year 1
C2 Year 2
我试图编写一个结合这些条件的函数,但我失败了。 我对 R 很陌生,不知道如何关联这些条件并将它们应用于整个数据框。
【问题讨论】:
-
如果您想要可执行的答案,请发一个小的reproducible example。在数据框上使用
dput并将其切成小尺寸等。 -
您不需要创建中间的
amount.vector*数据框,这只是对原始数据框的aggregate/ddply(summarize)操作。 -
在您的标题中,这些不是“交叉引用”。它只是多个列(公司、年份)的聚合,并带有源条件。就这样。您无需先按年份手动汇总每个公司,保存中间结果,然后按公司汇总,并以源为条件。
标签: r dataframe aggregate multiple-conditions split-apply-combine