【问题标题】:R - Conditional lagging - How to lag a certain amount of cells until a condition is met?R - 条件滞后 - 如何滞后一定数量的单元格直到满足条件?
【发布时间】:2016-07-23 04:09:06
【问题描述】:

数周以来一直试图解决这个问题,但似乎无法解决。

我有以下数据框:

    post_id user_id
1    post-1   user1
2    post-2   user2
3 comment-1   user1
4 comment-2   user3
5 comment-3   user4
6    post-3   user2
7 comment-4   user2

并想创建一个新变量parent_id。因此,对于每个观察,它应该执行以下步骤:

  1. 检查post_id 是post 还是comment
  2. 如果post_id 是post,那么parent_id 应该等于整个数据帧中最早的post_id。
  3. 如果post_id 是第一个帖子,那么parent_id 应该等于NA
  4. 如果post_id 是comment,那么parent_id 应该等于它遇到的第一个post_id。

输出应该类似于:

    post_id user_id parent_id_man
1    post-1   user1            NA
2    post-2   user2        post-1
3 comment-1   user1        post-2
4 comment-2   user3        post-2
5 comment-3   user4        post-2
6    post-3   user2        post-1
7 comment-4   user2        post-3

我尝试了以下方法:

#Prepare data
df <- df %>% separate(post_id, into=c("type","number"), sep="-", remove=FALSE)
df$number <- as.numeric(df$number)
df <- df %>% mutate(comment_number = ifelse(type == "comment",number,99999))
df <- df %>% mutate(post_number = ifelse(type == "post",number,99999))

#Create parent_id column
df <- df %>% mutate(parent_id = ifelse(type == "post",paste("post-",min(post_number), sep=""),0))
df <- df %>% mutate(parent_id = ifelse(parent_id == post_id,"NA",parent_id))
df <- df %>% select(-comment_number, -post_number)

使用该代码,我可以执行步骤 1、2 和 3,但 步骤 4 超出了我的范围。我觉得基于某种类型的条件滞后应该能够解决它,但无法想出如何去做。

任何想法将不胜感激!

【问题讨论】:

  • 请发布示例数据、所需的输出和您尝试过的代码。
  • 感谢@mtoto 的建议,我认为现在应该更清楚了。 :)

标签: r conditional selection dplyr


【解决方案1】:

以您的解决方案为基础,

x <- which(df$type == 'post')
z <- which(df$type == 'comment')
df$parent_id[df$parent_id == 0] <- df$post_id[x[sapply(z, function(i) findInterval(i, x))]]
df$parent_id
#[1] "NA"     "post-1" "post-2" "post-2" "post-2" "post-1" "post-3"

【讨论】:

  • 感谢您的回答索托斯!我想我理解它,但我在应用它时遇到了问题。
  • 根据您的示例数据,它应该可以通过复制粘贴来工作...您遇到了什么问题?
  • 抱歉上一篇文章不小心点击了提交。这些是我遇到的问题: 此代码的 sapply 部分:df$post_id[x[sapply(z, function(i) findInterval(i, x))]] 应用作为帖子的函数 findInterval(i),并将其应用于每个评论,对吗?如果我运行这部分代码,我会得到一个具有 7 个级别的因子[1] post-2 post-2 post-2 post-3,它正确命名了应该替换 parent_id 中的 0 的帖子。但是当我运行整行时,我得到:[1]“NA”“post-1”“6”“6”“6”“post-1”“7”
  • 这给了我:[1] "NA" "post-1" NA NA NA "post-1" NA这是df的结构:'data.frame': 7 obs. of 5 variables: $ post_id : Factor w/ 7 levels "comment-1","comment-2",..: 5 6 1 2 3 7 4 $ type : chr "post" "post" "comment" "comment" ... $ number : num 1 2 1 2 3 3 4 $ user_id : Factor w/ 4 levels "user1","user2",..: 1 2 1 3 4 2 2 $ parent_id: chr "NA" "post-1" NA NA ...
  • 将 post_id 转换为字符 df$post_id &lt;- as.character(df$post_id) 应该可以工作
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多