【问题标题】:Subsetting datasets in R using presence of keywords [closed]使用存在的关键字在 R 中对数据集进行子集化[关闭]
【发布时间】:2017-10-26 13:45:18
【问题描述】:

我有这个数据集:

> dput(SampleEvents)
structure(list(Event = structure(c(10L, 5L, 6L, 11L, 10L, 7L, 
11L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 11L), .Label = c("e10", "e11", 
"e12", "e13", "e2", "e3", "e6", "e8", "e9", "Login", "Logout"
), class = "factor"), Transaction.ID = structure(c(NA, 1L, NA, 
2L, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, NA), .Label = c("t1", 
"t4", "t5"), class = "factor"), User.ID = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("kenn1", 
"kenn2"), class = "factor"), Event.Date = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "20/5/2017", class = "factor"), 
    Event.Time = structure(c(12L, 13L, 14L, 15L, 1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L), .Label = c("10:01", "10:02", 
    "10:03", "10:04", "10:05", "10:06", "10:07", "10:08", "10:09", 
    "10:10", "10:11", "9:00", "9:30", "9:45", "9:50"), class = "factor")), .Names = c("Event", 
"Transaction.ID", "User.ID", "Event.Date", "Event.Time"), class = "data.frame", row.names = c(NA, 
-15L))

我想删除“事件”列下两个固定值内的所有行,即从“登录”到“注销”的行,这些行在“登录”和“注销”之间缺少所有交易 ID 值:

我还想保留数据集的当前顺序。

我如何在 R 中做到这一点?

【问题讨论】:

  • 请不要以图片形式提供您的数据。对于任何人使用它,他们都需要再次输入。相反,请使用文本格式。理想情况下,您将拥有 R 中的数据并使用 dput 来提供数据结构。您的图像看起来像是来自 Excel。 至少您可以保存为 csv 并将其粘贴到您的问题中。
  • 我对这个网站有点陌生。让我尝试附加数据集。
  • 是的,我想在这里有一个示例并了解逻辑,以便我可以将它应用到我的父数据集中。

标签: r regex subset keyword


【解决方案1】:

您可以使用您提供的数据执行以下操作...

library(dplyr)

#add variables to mark login-logout blocks and number them
df <- df %>% mutate(session=cumsum(Event=="Login")-cumsum(Event=="Logout"),
                    block=c(0,cumsum(diff(session)!=0)),
                    block=ifelse(Event=="Logout",block-1,block))

#identify blocks to remove
df2 <- df %>% group_by(block) %>% 
              summarise(Login=first(session)>0,
                        noTrans=all(is.na(Transaction.ID))) %>% 
              filter(Login & noTrans)

#remove unwanted blocks and delete temporary variables
df <- df %>% filter(!(block %in% df2$block)) %>% 
             select(-c(session,block))

df
   Event Transaction.ID User.ID Event.Date Event.Time
1  Login           <NA>   kenn1  20/5/2017       9:00
2     e2             t1   kenn1  20/5/2017       9:30
3     e3           <NA>   kenn1  20/5/2017       9:45
4 Logout             t4   kenn1  20/5/2017       9:50
5     e8           <NA>   kenn2  20/5/2017      10:04
6     e9             t5   kenn2  20/5/2017      10:05

【讨论】:

  • 我在运行第二个代码后收到一条警告消息:“警告消息:在 Ops.factor(10L, 0) : '>' 对因素没有意义”如果我忽略这一点并运行第三个代码,我得到一个观测值为零的数据集。
  • 检查您使用的是上述版本 - 我发现了一些错误并对其进行了一些修改!
  • 它现在没有给出任何警告信息,但数据集似乎没有变化。
  • 如果不查看您的数据的实际格式就无法判断,但它可能类似于流氓空间 - 例如"Login " 在 Event 列中,或者 TransactionID 中的空白是 " " 而不是 ""
  • 这行得通。非常感谢!
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 2023-03-12
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多