首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用R保留行,直到第一次出现

使用R保留行,直到第一次出现
EN

Stack Overflow用户
提问于 2016-02-26 14:19:27
回答 2查看 60关注 0票数 0

我在R 'HLS‘中有一个数据框架,它基本上是访问者访问网站时的页面细节。如果他已经移动到由page_count表示的第10页,则每行表示对从第3页到最多第10页的页面的每次访问,如下所示。

代码语言:javascript
复制
ID   page_count   purchase_flag   prob     hl_flag
V1      3              1          0.76       1
V1      4              1          0.65       1
V1      5              1          0.04       0
V1      6              1          0.86       1
V1      7              1          0.04       0
V1      8              1          0.65       1
V1      9              1          0.01       0
V1      10             1          0.00       0
V2      3              0          0.03       0
V2      4              0          0.01       0
V2      5              0          0.02       0
V2      6              0          0.00       0
V3      3              1          0.02       0
V3      4              1          0.001      0
V3      5              1          0.76       1
V3      6              1          0.03       0
V4      3              0          0.04       0
V4      4              0          0.65       1
V4      5              0          0.03       0 

我想创建一个表,如果情况是真的,那么它将获取行,直到第一次出现hl_flag=1,如果是hl_flag=0,那么对于任何ID,都将获取所有行。输出需要如下所示

代码语言:javascript
复制
ID     page_count     purchase_flag    prob     hl_flag
V1         3                1          0.76      1
V2         3                0          0.03      0
V2         4                0          0.01      0
V2         5                0          0.02      0
V2         6                0          0.00      0
V3         3                1          0.02      0
V3         4                1          0.001     0
V3         5                1          0.76      1
V4         3                0          0.04      0
V4         4                0          0.65      1

提前感谢您的帮助。

更新:如下所示添加dput的输出

代码语言:javascript
复制
structure(list(ung_id = c("00000f23-1019-4aff-8199-35bd0d032356/1", 
"00000f23-1019-4aff-8199-35bd0d032356/1", "00000f23-1019-4aff-8199-35bd0d032356/1", 
"00000f23-1019-4aff-8199-35bd0d032356/1", "00002b20-82d4-497b-a137-34e3bb4eaf74/1", 
"00002b20-82d4-497b-a137-34e3bb4eaf74/1", "00002b20-82d4-497b-a137-34e3bb4eaf74/1", 
"0000aeff-2d8b-4daa-a084-fb2980f1feed/1", "0000aeff-2d8b-4daa-a084-fb2980f1feed/1", 
"0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", "0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", 
"0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", "0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", 
"0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", "0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", 
"0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", "0000b96e-566f-4b6e-925a-b7dcfd4a7208/1", 
"0000d089-edda-4c8b-8b17-d9def3cae7cf/1", "0000d089-edda-4c8b-8b17-d9def3cae7cf/1", 
"0000d089-edda-4c8b-8b17-d9def3cae7cf/1"), nop_count = c(3L, 
4L, 5L, 6L, 3L, 4L, 5L, 3L, 4L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
3L, 4L, 5L), purchase_flag = c(1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), prob = c(0.0777615841278747, 
0.0738346887497272, 0.0741130887754292, 0.0785370078084892, 0.0619573259953132, 
0.0516201527986966, 0.0562025814090338, 0.0837301511694211, 0.0579033581198143, 
0.0364358545936557, 0.0329682922619259, 0.0420157964561273, 0.049855260762479, 
0.0500481302257314, 0.0463893143028813, 0.049855260762479, 0.0391886960037603, 
0.0683568422952682, 0.0570168506417919, 0.0661965354597502), 
decile = structure(c(8L, 8L, 8L, 8L, 6L, 4L, 5L, 8L, 5L, 
1L, 1L, 2L, 4L, 4L, 3L, 4L, 2L, 7L, 5L, 7L), .Label = c("(0.0257,0.0364]", 
"(0.0364,0.0428]", "(0.0428,0.0482]", "(0.0482,0.0531]", 
"(0.0531,0.0583]", "(0.0583,0.0645]", "(0.0645,0.0722]", 
"(0.0722,0.0842]"), class = "factor"), hl_Flag = c(1L, 1L, 
1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 1L, 1L)), .Names = c("ung_id", "nop_count", "purchase_flag", 
"prob", "decile", "hl_Flag"), row.names = c(NA, -20L), .internal.selfref = <pointer: 0x00000000002b0788>, class = c("data.table", 
"data.frame"))
EN

回答 2

Stack Overflow用户

发布于 2016-02-26 14:25:21

一种选择是使用data.table。我们将'data.frame‘转换为'data.table’(setDT(HLS)),按'ID‘分组,我们检查是否有any ' hl_flag’值为1。在这种情况下,我们使用which.max获得hl_flag中第一次出现1的索引,获得序列(1:(which.max..)),找到行索引(.I)或else仅返回行索引(.I),提取带有行索引的列($V1)并使用它来子集这些行。

代码语言:javascript
复制
library(data.table)
setDT(HLS)[HLS[, if(any(hl_flag==1)) .I[1:(which.max(hl_flag))]
               else .I, ID]$V1]
#     ID page_count purchase_flag  prob hl_flag
# 1: V1          3             1 0.760       1
# 2: V2          3             0 0.030       0
# 3: V2          4             0 0.010       0
# 4: V2          5             0 0.020       0
# 5: V2          6             0 0.000       0
# 6: V3          3             1 0.020       0
# 7: V3          4             1 0.001       0
# 8: V3          5             1 0.760       1
# 9: V4          3             0 0.040       0
#10: V4          4             0 0.650       1

或者类似于data.tableI showed方法,base R选项将为

代码语言:javascript
复制
do.call(rbind, lapply(split(HLS, HLS$ID), 
           function(x) if(any(x$hl_flag==1)) 
                  x[seq(which.max(x$hl_flag)), ] 
                else x))

或者使用dplyr

代码语言:javascript
复制
library(dplyr)
HLS %>% 
    group_by(ID) %>% 
    filter(all(!hl_flag)| row_number() %in% seq(which.max(hl_flag)))
 #      ID page_count purchase_flag  prob hl_flag
 #    (chr)      (int)         (int) (dbl)   (int)
 #1     V1          3             1 0.760       1
 #2     V2          3             0 0.030       0
 #3     V2          4             0 0.010       0
 #4     V2          5             0 0.020       0
 #5     V2          6             0 0.000       0
 #6     V3          3             1 0.020       0
 #7     V3          4             1 0.001       0
 #8     V3          5             1 0.760       1
 #9     V4          3             0 0.040       0
 #10    V4          4             0 0.650       1
票数 2
EN

Stack Overflow用户

发布于 2016-02-26 15:00:39

你可以试一试

代码语言:javascript
复制
l <- lapply(split(df, df$ID), function(x) {if(any(x[5] == 1)) x[1:which.max(x[5] == 1),] else x})

id拆分df,然后子集每个列表,直到任何hl_flag == 1为止,这将为您提供一个ID明智的列表

代码语言:javascript
复制
#$V1
#  ID page_count purchase_flag prob hl_flag
#1 V1          3             1 0.76       1

#$V2
#   ID page_count purchase_flag prob hl_flag
#9  V2          3             0 0.03       0
#10 V2          4             0 0.01       0
#11 V2          5             0 0.02       0
#12 V2          6             0 0.00       0

#$V3
#   ID page_count purchase_flag  prob hl_flag
#13 V3          3             1 0.020       0
#14 V3          4             1 0.001       0
#15 V3          5             1 0.760       1

#$V4
#   ID page_count purchase_flag prob hl_flag
#17 V4          3             0 0.04       0
#18 V4          4             0 0.65       1

要获得预期的结果,您可以使用dplyr包中的bind_rows

代码语言:javascript
复制
library(dplyr)
bind_rows(l)

#ID page_count purchase_flag  prob hl_flag
#(fctr)      (int)         (int) (dbl)   (int)
#1      V1          3             1 0.760       1
#2      V2          3             0 0.030       0
#3      V2          4             0 0.010       0
#4      V2          5             0 0.020       0
#5      V2          6             0 0.000       0
#6      V3          3             1 0.020       0
#7      V3          4             1 0.001       0
#8      V3          5             1 0.760       1
#9      V4          3             0 0.040       0
#10     V4          4             0 0.650       1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35644861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档