【问题标题】:fill a column based on another column with the respect to value in the row and next rows in R根据 R 中行和下一行中的值填充基于另一列的列
【发布时间】:2020-04-15 12:13:03
【问题描述】:

假设我有 3 列。第一列是user,应该将哪些数据分组。每个user 可以有多个session。我有action 列,其中包含一些值和NAs,我想根据session 和``用户:

对于每个用户,用其值填充action 列,直到出现以下两种情况:

1-继续填写直到达到session+1 号码。这意味着如果action == A and session==2A 填充所有NA 值,直到session 4,其中包括session 2 和3。

2- 直到在session+1 内达到新的action 值。在这种情况下,新值开始填充,直到它的session +1

df<-read.table(text="
user    session    action
1          1        NA
1          1        A
1          1        NA
1          1        B
1          2        NA
1          2        NA
1          3        NA  
2          1        AA
2          1        NA
2          1        NA
2          2        NA
2          3        NA
2          4        AA
2          5        NA
2          6        NA
2          7        AA
2          8        NA",header=T, stringsAsFactors = FALSE)

结果:(我突出显示了受影响的行)

user    session    action
    1          1        NA
    1          1        A
    1          1        A  <--
    1          1        B
    1          2        B  <--
    1          2        B  <--
    1          3        NA  
    2          1        AA
    2          1        AA <--
    2          1        AA <--
    2          2        AA <--
    2          3        NA
    2          4        AA
    2          5        AA <--
    2          6        NA
    2          7        AA
    2          8        AA <--

【问题讨论】:

  • 为什么session 3中的NA没有被替换?
  • @RonakShah 因为AA 出现在会话1 所以它会填满直到session

标签: r dataframe


【解决方案1】:

这是一种相反的方法。我们首先为每个user fill 所有action 值,然后将这些值更改为NA,其中每个actionsession 计数大于2。

library(dplyr)

df %>%
  group_by(user) %>%
  mutate(grp = cumsum(!is.na(action))) %>%
  tidyr::fill(action) %>%
  group_by(grp, add = TRUE) %>%
  mutate(temp = replace(action, cumsum(!duplicated(session)) > 2, NA)) %>%
  ungroup() %>%
  select(-grp)

#    user session action temp 
#   <int>   <int> <chr>  <chr>
# 1     1       1 NA     NA   
# 2     1       1 A      A    
# 3     1       1 A      A    
# 4     1       1 B      B    
# 5     1       2 B      B    
# 6     1       2 B      B    
# 7     1       3 B      NA   
# 8     2       1 AA     AA   
# 9     2       1 AA     AA   
#10     2       1 AA     AA   
#11     2       2 AA     AA   
#12     2       3 AA     NA   
#13     2       4 AA     AA   
#14     2       5 AA     AA   
#15     2       6 AA     NA   
#16     2       7 AA     AA   
#17     2       8 AA     AA   

【讨论】:

  • 我更新了数据。你的代码有一个小问题。如果我们在用户 2 的action 列中使用AA 而不是BB,它会在会话3 之后为所有session 生成NA,即使我们在会话4 中有AA 操作。
  • @Cina 更新了答案。
猜你喜欢
  • 1970-01-01
  • 2020-07-19
  • 2020-11-26
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多