在R中的某些条件下更新列值

在R中的某些条件下更新列值,r,R,在上面的数据框中,我想从最后一行转到第一行,并将列type重命名为“action1”/“action2/”,以此类推,但仅针对特定的visitIp,如下所示 > ds[1:20,1:5] idSite idVisit visitIp visitorId type 1 1 4103 8.37.230.12 0b146529434a43e3 action 2 1 4103 8.37.230.12

在上面的数据框中,我想从最后一行转到第一行,并将列
type
重命名为“action1”/“action2/”,以此类推,但仅针对特定的
visitIp
,如下所示

    > ds[1:20,1:5]
   idSite idVisit         visitIp        visitorId   type
1       1    4103     8.37.230.12 0b146529434a43e3 action
2       1    4103     8.37.230.12 0b146529434a43e3 action
4       1    4100 117.212.128.163 2fda542e2cac67d4 action
5       1    4100 117.212.128.163 2fda542e2cac67d4 action
6       1    4100 117.212.128.163 2fda542e2cac67d4 action
8       1    4102  187.134.160.17 ab2413b2ed5bccc4 action
11      1    4099  168.235.201.23 5e8b3f87bd30cc1b action
12      1    4099  168.235.201.23 5e8b3f87bd30cc1b action
13      1    4099  168.235.201.23 5e8b3f87bd30cc1b action
14      1    4099  168.235.201.23 5e8b3f87bd30cc1b action
16      1    4101   5.107.224.242 fc77e4a99d153c16 action
19      1    4098  119.156.96.132 d083c7814aefc5e4 action
21      1    4097  95.221.204.238 87b98db4b05df2b0 action
23      1    4096  122.173.30.126 4386834b62126a2b action
25      1    4092   42.109.204.55 4744bd421d7f06b8 action
26      1    4092   42.109.204.55 4744bd421d7f06b8 action
27      1    4092   42.109.204.55 4744bd421d7f06b8 action
28      1    4092   42.109.204.55 4744bd421d7f06b8 action
29      1    4092   42.109.204.55 4744bd421d7f06b8 action
32      1    4041   49.35.130.191 eb8795f74c372b41 action
我有一个用于此的for循环代码,但是如果数据帧较大(超过30k行),则需要花费相当多的时间。我希望避免for循环,以便更快地完成此操作。我的代码如下

    > dactions[1:20,1:5]
   idSite idVisit         visitIp        visitorId    type
1       1    4103     8.37.230.12 0b146529434a43e3 action2
2       1    4103     8.37.230.12 0b146529434a43e3 action1
4       1    4100 117.212.128.163 2fda542e2cac67d4 action3
5       1    4100 117.212.128.163 2fda542e2cac67d4 action2
6       1    4100 117.212.128.163 2fda542e2cac67d4 action1
8       1    4102  187.134.160.17 ab2413b2ed5bccc4 action1
11      1    4099  168.235.201.23 5e8b3f87bd30cc1b action4
12      1    4099  168.235.201.23 5e8b3f87bd30cc1b action3
13      1    4099  168.235.201.23 5e8b3f87bd30cc1b action2
14      1    4099  168.235.201.23 5e8b3f87bd30cc1b action1
16      1    4101   5.107.224.242 fc77e4a99d153c16 action1
19      1    4098  119.156.96.132 d083c7814aefc5e4 action1
21      1    4097  95.221.204.238 87b98db4b05df2b0 action1
23      1    4096  122.173.30.126 4386834b62126a2b action1
25      1    4092   42.109.204.55 4744bd421d7f06b8 action5
26      1    4092   42.109.204.55 4744bd421d7f06b8 action4
27      1    4092   42.109.204.55 4744bd421d7f06b8 action3
28      1    4092   42.109.204.55 4744bd421d7f06b8 action2
29      1    4092   42.109.204.55 4744bd421d7f06b8 action1
32      1    4041   49.35.130.191 eb8795f74c372b41 action4
#重命名操作

ds$type要获得按给定变量分组的累计计数,通常将
ave()
函数与
cumsum()函数一起使用:

    #rename actions
ds$type<-as.characterds$type)
count<-0
visitedIp<-""
for(i in nrow(ds):1){
  if(ds[i,]$visitIp!=visitedIp){
    count<-1
    visitedIp<-ds[i,]$visitIp
    ds[i,]$type<-paste0(ds[i,]$type,as.character(count))
    next
  }else{
    count<-count+1
    ds[i,]$type<-paste0(ds[i,]$type,as.character(count))
  }
}
dactions<-ds
要按组获取反向计数器,只需反转分组向量(第二个参数),以反转计数器,然后反转结果以将其与数据匹配:

#first arg is input to cumsum (set to 1 here), second arg is grouping variable
ave(rep(1, nrow(ds)), ds$visitIp, FUN = cumsum)

如果您没有使用,请删除python标记好吗?VisiteIP在哪里?为什么不直接使用
ifelse
?请删除
python
标记。@saurav shekhar:VisiteIP是我定义的一个变量,用于在for循环中存储当前visitIp。我的重点是重命名列值,如示例所示,因为我做了进一步的操作对每个“动作1”、“动作2”和“动作3”的分析@KaustubhVyas你的评论毫无意义。这一行代码完成了您试图执行的操作:
ds$type对不起,前面的评论……实际上您的解决方案正在运行,但在我的数据中,vistitIp在一个数据帧中重复了几次。我想只考虑后面的一组IPS。例如,上述示例中的ip 8.37.230.12在实际数据帧中再次重复。所以它计算它并将其重命名为action1,而示例中显示的行重命名为action2和action3,这不是我想要的。
rev(ave(rep(1, nrow(ds)), rev(ds$visitIp), FUN = cumsum))