【问题标题】:Creating a new column with conditions in addition to the row value of the new column除了新列的行值之外,创建具有条件的新列
【发布时间】:2022-01-04 18:28:15
【问题描述】:

关于如何使用列 A 的值创建新列 B 的任何想法, 同时使用新创建的列 B 的上一行的值?

B的值应该对应于:

A0 = value of the row above.
A1 = 1.
A2 = value of the row above + 1.

当前数据框 + 期望结果

                
Dataframe           Desired outcome  
A                   A   B
1                   1   1
0                   0   1
2                   2   2
0                   0   2
2                   2   3
0                   0   3
2                   2   4
0                   0   4
2                   2   5
0                   0   5
2                   2   6
0                   0   6
1                   1   1
0                   0   1
1                   1   1
0                   0   1
2                   2   2
0                   0   2
2                   2   3
0                   0   3
1                   1   1
0                   0   1
2                   2   2
0                   0   2


Data Frame
A <- c(1,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,2,0,2,0,1,0,2,0)
Bdesiredoutcome <- c(1,1,2,2,3,3,4,4,5,5,6,6,1,1,1,1,2,2,3,3,1,1,2,2)
df = data.frame(A,Bdesiredoutcome)

我尝试使用dpylr, mutate(), case_when()lag(),但一直遇到错误。由于使用了lag() 函数。使用lag(A) 时,无法生成所需的结果。 关于如何解决这个问题的任何想法?

df <- df %>%
          mutate(B = case_when((A == 0) ~ lag(B), 
                               (A == 1) ~ 1,
                               (A == 2) ~ (lag(B)+1)
    ))

Error in UseMethod("mutate_") : 
  no applicable method for 'mutate_' applied to an object of class "function"
In addition: Warning message:

【问题讨论】:

  • 错误是因为你没有B 列,而只有Bdesired 即如果你做了` mutate(B = Bdesired, B= case_when((A == 0) ~滞后(B),...`它应该工作
  • 感谢您的快速分析,遗憾的是,Bdesired 是预期的结果,不适用于整个数据。因此,我尝试仅使用 A 来计算 B。结果形式 B 应与 Bdesired 相同。我已经编辑了帖子以使其清楚,谢谢=)
  • 好的,但是当您的代码根本不存在时,它会显示lag(B)

标签: r dplyr case lag mutated


【解决方案1】:

关于你原来的问题,我得到了以下信息:

library(tidyverse)
library(lubridate)

df$date <-dmy(df$date)


df <- df %>% 
  arrange(id, date) %>%
  group_by(id) %>%
  mutate(daysbetween = replace_na(date - lag(date),0),
         ind = 1,
         NewA= case_when (daysbetween < 7 ~ 0, daysbetween > 7 ~ 1),
         NewB= case_when (daysbetween < 85 ~ 0, daysbetween > 85 ~ 1),
         A =   case_when (1 + cumsum(ind*NewA) <= 6 ~ 1 + cumsum(ind*NewA),
                          1 + cumsum(ind*NewA) > 6 ~ 1 + cumsum(ind*NewA) - 6),
         B =  1 + cumsum(ind*NewB))%>%
  select(id, date, A, B)

仅当 A 的重置为 6 时才有效。我按照上面的建议使用了 cumsum()

【讨论】:

  • 非常感谢!我很抱歉简化了这个问题。我通过我会更容易。不知道你正在研究它。感谢您的投入!我可以用它来做另一个带有新数据的变量列(:!
【解决方案2】:

我们可以用cumsum创建一个分组列,然后创建'B'列

library(dplyr)
df %>% 
   group_by(grp = cumsum(A == 1)) %>% 
   mutate(B = cumsum(A != 0)) %>% 
   ungroup %>%
   select(-grp) %>%
   as.data.frame

-输出

   A Bdesired B
1  1        1 1
2  0        1 1
3  2        2 2
4  0        2 2
5  2        3 3
6  0        3 3
7  2        4 4
8  0        4 4
9  2        5 5
10 0        5 5
11 2        6 6
12 0        6 6
13 1        1 1
14 0        1 1
15 1        1 1
16 0        1 1
17 2        2 2
18 0        2 2
19 2        3 3
20 0        3 3
21 1        1 1
22 0        1 1
23 2        2 2
24 0        2 2

【讨论】:

  • @Gebruiker10 谢谢。您也可以查看here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2022-08-17
  • 2019-08-15
  • 2015-12-21
  • 2018-12-30
  • 2021-11-02
相关资源
最近更新 更多