楼主: wx2123
9202 17

[问答] R语言数据处理的问题 [推广有奖]

  • 1关注
  • 2粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
5595 个
通用积分
220.6077
学术水平
1 点
热心指数
5 点
信用等级
0 点
经验
3111 点
帖子
93
精华
0
在线时间
193 小时
注册时间
2015-9-10
最后登录
2025-11-9

楼主
wx2123 在职认证  发表于 2022-2-24 09:56:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

有一个表格df1,包括id, t, dm, s这4列。其中

* id有重复。这里只列出id = 1,2的情况,但是真实数据中还有很多,id=1,2,...,100.

* t可以理解为时间,1-7天,或者1-7月等等。

* dm是另一个参数,要根据dm做一些lag。

* s是一些数值。

df1

df1


根据这些来计算df2中x的值。具体算法如下:

id = 1时,dm = 1。x的值比s的值滞后(lag)一行。

id = 2时,dm有两个值(2和3)。

dm = 2时, x的值比s的值滞后(lag)两行。

dm = 3时, x的值比s的值滞后(lag)三行。

其中第12行的x值为0

df2

df2

这个如何实现呢?

我已经试过left join,shift等办法,都没有搞定。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据处理 R语言 left join shift left

回帖推荐

正直者之死 发表于14楼  查看完整内容

之前处理的逻辑不变,仅作添加部分(图就不贴了)

沙发
owenqi 在职认证  学生认证  发表于 2022-2-25 00:12:05
你的描述并不清楚,为什么dm = 1,你是所有的数据都往后移一格,但是dm = 2的时候只有前两个数据往后移两格,而不是所有数据都往后移两格,如果id = 2, dm = 1,3或者1,2的话又会是怎么样?
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

藤椅
wx2123 在职认证  发表于 2022-2-25 10:17:50
谢谢关注。你说的这两种情况我在下面列出来了。

当id = 2, dm = 1,3时,x的值为0 4 8 0 0 3 5.
df3_x.png
当id = 2, dm = 1,2时,x的值为0 4 8 0 3 5 45
df4_x.png




df3_x.png (7.53 KB)

df3_x.png

板凳
owenqi 在职认证  学生认证  发表于 2022-2-26 01:53:20
wx2123 发表于 2022-2-25 10:17
谢谢关注。你说的这两种情况我在下面列出来了。

当id = 2, dm = 1,3时,x的值为0 4 8 0 0 3 5.
实际上你并没有回答我的问题,只是把其中的一种结果列出来了而已,关键是
dm = 2的时候只有前两个数据往后移两格,而不是所有数据都往后移两格
这个问题本来是要了解x移动的规则,但你现在只列出了两种情况,dm = {1,1,2,2,2,2,2} 和 dm = {2,2,3,3,3,3,3}
那如果是dm = {1,1,1,1,1,2,2},dm = {2,2,2,2,2,1,1}, dm = {1,1,1,1,1,3,3}, dm = {3,3,3,3,1,1,1},dm = {1,2,3,3,3,3,3,3}, dm = {3,3,3,2,2,2,1}这些情况呢,dm的取值和组合有什么限制吗?
请把你的移动规则描述清楚(或者设计清楚),否则确实不知道你想干什么。

报纸
owenqi 在职认证  学生认证  发表于 2022-2-26 03:36:48
根据你目前的描述,可以这样处理,当然,随着描述的进一步准确,潜在的bug可以修复
  1. library(dplyr)
  2. df1 <- data.frame(id = rep(1:2, each = 7),
  3.                   t = rep(1:7, times = 2),
  4.                   dm = c(rep(1,7), rep(1,2), rep(2,5)),
  5.                   s = c(15,66,77,80,97,26,15,4,8,3,5,45,85,35))

  6. dfs <- split(df1, df1$id)

  7. x_val <- function(dat){
  8.   
  9.   rle_dm <- rle(dat$dm)
  10.   l <- rle_dm$lengths[1]
  11.   n <- rle_dm$values
  12.    
  13.   if(length(n) == 1)
  14.     dat <- dat %>% mutate(x = lag(s, default = 0))
  15.   
  16.   else{
  17.     s <- dat$s
  18.     x1 <- lag(s, n = n[1], default = 0)
  19.     x2 <- lag(s[-c(1:l)], n = n[2], default = 0)
  20.     x <- c(head(x1, n[1] + l), tail(x2, length(s) - n[1] - l))
  21.     dat <- dat %>% mutate(x)
  22.   }
  23. }

  24. dfx <- lapply(dfs, x_val)
  25. (df <- bind_rows(dfx))
复制代码
已有 1 人评分论坛币 学术水平 收起 理由
jiangbeilu + 10 + 1 精彩帖子

总评分: 论坛币 + 10  学术水平 + 1   查看全部评分

地板
wx2123 在职认证  发表于 2022-2-26 11:59:04
感谢回复,我先试试看。然后在想想lag的规则到底是什么。我也在摸索。

7
wx2123 在职认证  发表于 2022-2-26 13:33:28
owenqi 发表于 2022-2-26 03:36
根据你目前的描述,可以这样处理,当然,随着描述的进一步准确,潜在的bug可以修复
你说的对,我也在探索x移动的规则。而且我可能在误导你,因为我自己说的也不一定对。
这个问题可能没有那么复杂。

不知道你SAS熟不熟,我就是想产生下面SAS程序的结果:
  1. data One;
  2.   input  id t dm e s f;
  3.   cards;
  4. 1 1  1  10 15 0                                                                                                               
  5. 1 2  1  20 66 0                                                                                                         
  6. 1 3  1  30 77 0                                                                                                            
  7. 1 4  1  40 80 0
  8. 1 5  1  40 97 0   
  9. 1 6  1  40 26 0
  10. 1 7  1  10 15 0                                                                                          
  11. 2 1  1  90 4  2
  12. 2 2  1  80 8  1
  13. 2 3  2  66 3  2
  14. 2 4  2  44 5  1
  15. 2 5  2  90 45  2
  16. 2 6  2  80 85  1
  17. 2 7  2  66 35  2                                                                                                            
  18. ;
  19. run;

  20. data Two;
  21.   set One;
  22.   by id;

  23.   array o{0:150}  _temporary_;
  24.   array dc{0:150} _temporary_;
  25.        
  26.   if first.id then do;
  27.     do i = 0 to 10;
  28.         dc[i] =0;
  29.         o[i] = 0;
  30.     end;
  31.   end;
  32.        
  33.         /* 主要问题在这里 */
复制代码


输出结果如下。注意每个id的最后一行并非是移动,而是要求和。谢谢!
output.png


8
wx2123 在职认证  发表于 2022-2-26 23:42:51
我发现有一部分程序没有贴上去,而且是重要的部分。我把Data Two再贴一次。
  1. data Two;
  2.   set One;
  3.   by id;
  4.   array o{0:150}  _temporary_;
  5.   array dc{0:150} _temporary_;
  6.   if first.id then do;
  7.     do i = 0 to 10;
  8.       dc[i] =0;
  9.       o[i] = 0;
  10.     end;
  11.   end;
  12.        
  13.         /* 主要问题在这里 */
  14.   dc[t+dm] = dc[t+dm] + s;
  15.   if last.id then do;
  16.      x    = 0;
  17.      do i = 0 to 3;
  18.          x = x + dc[t+i];
  19.          d3 = dc[t+i];
  20.         put '------------------';
  21.         put 'i t d3 x';
  22.         put  i t d3 x;
  23.      end;
  24.   end;
  25.   else do;
  26.       x = dc[t];
  27.       put '********************';
  28.       put x;
  29.    end;
  30. run;
复制代码


9
owenqi 在职认证  学生认证  发表于 2022-2-27 05:20:01
wx2123 发表于 2022-2-26 13:33
你说的对,我也在探索x移动的规则。而且我可能在误导你,因为我自己说的也不一定对。
这个问题可能没有那 ...
你的代码没办法输出你给的图,你的没有定义x.

10
wx2123 在职认证  发表于 2022-2-27 14:21:05 来自手机
owenqi 发表于 2022-2-27 05:20
你的代码没办法输出你给的图,你的没有定义x.
x是在data two里面算出来的

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

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