我正在努力为以下问题找到有效的解决方案:
我有一个大的操作数据框架,大约有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列的值,其中原始数据帧的字符串元素为vector1的列$source==字符串元素。当然,列$amount.vector2的元素也是不同的。
如果没有可用的值,则应该添加"0“而不是NA错误。这需要对整个原始数据框架进行处理,其中包括大约250家公司,每一家公司的数据为1:8 (差别很大)。
编辑:对于数据框架,我需要每个公司每年一行.
C1 Year 1
C1 Year 2
C1 Year 3
C2 Year 1
C2 Year 2我试图编写一个合并了这些条件的函数,但失败了。我对R非常陌生,不知道如何将这些条件联系起来,并将它们应用到整个数据框架中。
发布于 2014-03-10 02:54:28
您的数据是“长格式”(多行公司、源、年、.)
为了获得多个源值,您希望对每个公司和每年进行聚合 amount.inkg。特别地,您希望在“源”字段上使用条件词进行聚合。
再一次,请给我们一个可复制的例子。(谢谢乔西伯)。这是一个四行线,包含拆分-应用-合并(Ddply)或逻辑索引:
df = data.frame(company.raw = c("C1", "C1", "C2", "C2", "C2", "C2"),
years.raw = c(1, 1, 1, 1, 2, 2),
source = c("Ink", "Recycling", "Coffee", "Combusted", "Printer", "Tea"),
amount.inkg = c(5, 2, 10, 15, 14, 18))
# OPTION 1. Split-Apply-Combine: ddply(...summarize) with a conditional on the data
require(plyr) # dplyr if performance on large d.f. becomes an issue
ddply(df, .(company.raw,years.raw), summarize,
amount.vector1=sum(amount.inkg[source %in% c('Tea','Coffee')]),
amount.vector2=sum(amount.inkg[source %in% c('Ink','Printer')]),
amount.vector3=sum(amount.inkg[source %in% c('Recycling','Combusted')])
)
# OPTION 2. sum with logical indexing on the df:
# (This is from before you modified the question to one-row-per-company-and-per-year)
df$amount.vector1 <- sum( df[(df$source %in% c('Tea','Coffee')),]$amount.inkg )
# josilber clarifies you want one-row-per-company
...选项3.您也可以将aggregate(这里的手册)与subset(...)结合使用,尽管用于sum的聚合是过高的。
aggregate(df, source %in% c('Tea','Coffee'), FUN = sum)聚合的by参数是操作所在的位置(选择,根据标准进行细分)。
注意:%in%执行扫描操作,所以如果你的向量和d.f。变大,或者为了可伸缩性,您需要将其分解为布尔操作,这些操作可以向量化:(source=='Tea' | source=='Coffee')
至于防止NA和,如果子集是空的,sum(c()) = 0,所以不要担心。但是如果您这样做了,可以使用na.omit,或者对最终结果执行ifelse(is.na(x),0,x)。
发布于 2014-03-10 03:20:04
这是一个很好的任务,对拆分-应用-组合范式。首先,您将数据框架拆分为公司/年份对:
data = data.frame(company.raw = c("C1", "C1", "C2", "C2", "C2", "C2"),
years.raw = c(1, 1, 1, 1, 2, 2),
source = c("Ink", "Recycling", "Coffee", "Combusted", "Printer", "Tea"),
amount.inkg = c(5, 2, 10, 15, 14, 18))
spl = split(data, paste(data$company.raw, data$years.raw))现在,为拆分数据中的每个元素计算汇总数据框架:
spl2 = lapply(spl, function(x) {
data.frame(Company=x$company.raw[1],
Year=x$years.raw[1],
amount.vector1 = sum(x$amount.inkg[x$source %in% vector1]),
amount.vector2 = sum(x$amount.inkg[x$source %in% vector2]),
amount.vector3 = sum(x$amount.inkg[x$source %in% vector3]))
})最后,把所有的东西组合在一起:
do.call(rbind, spl2)
# Company Year amount.vector1 amount.vector2 amount.vector3
# C1 1 C1 1 0 5 2
# C2 1 C2 1 10 0 15
# C2 2 C2 2 18 14 0https://stackoverflow.com/questions/22291047
复制相似问题