【问题标题】:Compare previous list element using the apply function family R, get rid of for loops使用应用函数族 R 比较前一个列表元素,摆脱 for 循环
【发布时间】:2015-02-11 07:48:57
【问题描述】:

我一直希望尽量减少在 R 中使用 for 循环。无论如何,是否可以在没有 for 循环的情况下将当前元素与列表中的前一个元素进行比较?这是我正在处理的问题的简化版本。

如果 First_Transaction 列是个人的第一笔交易,我想将其标记为 1。数据已按人员和日期排序。

   Name Amount Date First_Transaction 
1   Joe 50  01/05/15    0
2   Joe 43  02/05/15    0
3   Joe 40  03/05/15    0
4   Tom 40  01/03/15    0
5   Tom 34  01/29/15    0
6   Tom 22  02/05/15    0
7   Tom 49  02/10/15    0
8   Kim 28  03/10/15    0
9   Kim 19  03/20/15    0
10  Kim 24  04/13/15    0
11  Kim 35  04/20/15    0

使用 for 循环,我将第一行标记为 1,然后使用逻辑检查当前名称是否与以前的名称匹配。如果没有,请标记 First_Transaction 列 1。

test$First_Transaction[1]=1

for(i in 2:length(test$Name)){
  if(test$Name[i] != test$Name[i-1]){
    test$First_Transaction[i]=1
  }

有可以实现这个逻辑的apply族函数吗?我真的很想弄清楚如何在没有循环的情况下做到这一点。谢谢!

【问题讨论】:

    标签: r for-loop apply lapply


    【解决方案1】:

    如果对于每组“Name”,“First_Transaction”的第一个观察值应更改为“1”,我们可以使用ave

     df1$First_Transaction <- as.numeric(with(df1, 
             ave(seq_along(First_Transaction),Name, FUN=seq_along)==1))
    

    或者我们可以将“名称”的当前元素与下一个元素进行比较

     as.numeric(with(df1, c(TRUE, Name[-1]!=Name[-nrow(df1)])))
    

    或使用duplicated

     as.numeric(!duplicated(df1$Name))
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2017-11-25
      • 2017-04-13
      • 1970-01-01
      • 2014-12-17
      相关资源
      最近更新 更多