楼主: 乌贼07
2635 2

[有偿编程] 关于R的多条件求和的问题 [推广有奖]

  • 0关注
  • 9粉丝

已卖:299份资源

硕士生

56%

还不是VIP/贵宾

-

威望
0
论坛币
14381 个
通用积分
51.8460
学术水平
16 点
热心指数
24 点
信用等级
11 点
经验
2855 点
帖子
105
精华
0
在线时间
190 小时
注册时间
2009-4-9
最后登录
2023-8-22

楼主
乌贼07 发表于 2017-6-19 17:22:29 |AI写论文
50论坛币
> Rquestion
   Fvalue Tvalue Wvalue   Dvalue Result
1   Name4  Name1   0.45 2017/6/1   0.90
2   Name4  Name1   0.45 2017/6/1   0.90
3   Name6  Name2   0.41 2017/6/1   0.41
4   Name2  Name3   0.51 2017/6/2   0.51
5   Name5  Name3   0.32 2017/6/3   0.32
6   Name4  Name1   0.29 2017/6/3   0.29
7   Name3  Name4   0.15 2017/6/4   0.30
8   Name5  Name4   0.36 2017/6/5   0.36
9   Name3  Name4   0.21 2017/6/5   0.21
10  Name2  Name5   0.32 2017/6/6   0.32
11  Name1  Name6   0.99 2017/6/6   0.99
12  Name4  Name6   0.38 2017/6/6   0.38
13  Name3  Name4   0.15 2017/6/4   0.30


######################################
最近在做一个分析,有个技术性问题难到我了。如果是用VBA做的话,我会,但是数据量大,很慢。最近刚入手R,很多操作不太懂。


现在有一个数据框Rquestion,里面有4列数据,第5列Result是我想要的结果。

要求是这样的(不用加载包,仅使用基础包):

对当天的交易记录,如果是同一组有重复的交易记录,则对其第3列进行求和,结果统一赋值到第5列;否则,令第5列的值=第3列的值。

例如:2017/06/01当天, Name4,Name1是同一组交易记录(注意Name4,Name1和Name1,Name4是不同的组),对第3列的值求和(=0.45+0.45),结果放在第5列。

又如:2017/06/04,Name3,Name4出现了2次,对其第3列求和(=0.15+0.15),结果为0.30,将结果0.30赋值于他们的第5列。

#########################################
不知道我表达清楚了没?

我是这么想的(伪代码),不太会,呵呵:

ind<-(Rquestion$DValue=="2017/6/1") & (Fvalue属性拼Tvalue属性唯一);
Rquestion$Result<-sum(Rquestion[ind,3]);




最佳答案

cheetahfly 查看完整内容

这个问题正好适用大神Hadley Wickham提出来的Split-Apply-Combine策略: 至于该策略的具体思想,请上网搜索“Split-Apply-Combine”
关键词:条件求和 多条件 question Result value

沙发
cheetahfly 在职认证  发表于 2017-6-19 17:22:30
这个问题正好适用大神Hadley Wickham提出来的Split-Apply-Combine策略
  1. # split
  2. temp_list <- split(Rquestion, list(a$Fvalue, a$Tvalue, a$Dvalue), drop = TRUE)
  3. # apply
  4. temp_list <- lapply(temp_list, function(x) {x$Result <- sum(x$Wvalue); x})
  5. # combine
  6. temp_list$make.row.names <- FALSE
  7. result <- do.call("rbind", temp_list)
复制代码
至于该策略的具体思想,请上网搜索“Split-Apply-Combine
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
jiangbeilu + 10 + 2 精彩帖子
gongjiangchao + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 10  学术水平 + 3  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
jiangbeilu 学生认证  发表于 2017-6-20 13:34:33
如果最后不保留重复值的话,可以采用如下的方法来计算:就是一个简单的分组求和问题,用tapply或者aggregate函数都能解决。
直接用aggregate来进行计算即可:
  1. A=c("A","B","A","C")
  2. B=c("B","A","B","A")
  3. C=1:4
  4. zz <- data.frame(A,B,C)
  5. aggregate(C~A+B,data=zz,sum)
复制代码


您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 11:18