首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中多个条件的有效条件求和

R中多个条件的有效条件求和
EN

Stack Overflow用户
提问于 2014-03-10 02:21:25
回答 2查看 2.9K关注 0票数 0

我正在努力为以下问题找到有效的解决方案:

我有一个大的操作数据框架,大约有8列和80000行,通常包含多个数据类型。我想要创建一个新的数据框架,如果满足来自大数据帧的条件,它将包含一列的和。

想象一下原始数据框架的头看起来是这样的。列$years.raw表示公司测量了x年的数据。

代码语言:javascript
运行
复制
> 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的一部分。

代码语言:javascript
运行
复制
> vector1 <- c("Tea","Coffee")
> vector2 <- c("Ink","Printer")
> vector3 <- c("Recycling","Combusted")

然后,首选数据框架将如下所示:

代码语言:javascript
运行
复制
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 (差别很大)。

编辑:对于数据框架,我需要每个公司每年一行.

代码语言:javascript
运行
复制
C1 Year 1  
C1 Year 2
C1 Year 3
C2 Year 1
C2 Year 2

我试图编写一个合并了这些条件的函数,但失败了。我对R非常陌生,不知道如何将这些条件联系起来,并将它们应用到整个数据框架中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-10 02:54:28

您的数据是“长格式”(多行公司、源、年、.)

为了获得多个源值,您希望对每个公司和每年进行聚合 amount.inkg。特别地,您希望在“源”字段上使用条件词进行聚合。

再一次,请给我们一个可复制的例子。(谢谢乔西伯)。这是一个四行线,包含拆分-应用-合并(Ddply)或逻辑索引:

代码语言:javascript
运行
复制
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的聚合是过高的。

代码语言:javascript
运行
复制
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)

票数 2
EN

Stack Overflow用户

发布于 2014-03-10 03:20:04

这是一个很好的任务,对拆分-应用-组合范式。首先,您将数据框架拆分为公司/年份对:

代码语言:javascript
运行
复制
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))

现在,为拆分数据中的每个元素计算汇总数据框架:

代码语言:javascript
运行
复制
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]))
})

最后,把所有的东西组合在一起:

代码语言:javascript
运行
复制
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              0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22291047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档