在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))