Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
添加带有mutate和group by的新列_R_Dplyr_Plyr_Tidyr - Fatal编程技术网

添加带有mutate和group by的新列

添加带有mutate和group by的新列,r,dplyr,plyr,tidyr,R,Dplyr,Plyr,Tidyr,我想基于以前的列和group by函数创建一个名为age的新列。数据集如下所示: tid<- c(1,2,3,4, 1,2,3,4,1,2,3,4) active<- c(0,1,0,4, 0,0,0,1,0,0,1,0) person<- c('John', 'John','John', 'John', 'Emma', 'Emma','Emma','Emma', 'Edward', 'Edward', 'Edward', 'Edward') df<- data.fram

我想基于以前的列和group by函数创建一个名为age的新列。数据集如下所示:

tid<- c(1,2,3,4, 1,2,3,4,1,2,3,4)
active<- c(0,1,0,4, 0,0,0,1,0,0,1,0)
person<- c('John', 'John','John', 'John', 'Emma', 'Emma','Emma','Emma', 'Edward', 'Edward', 'Edward', 'Edward')
df<- data.frame(tid, active, person)
 name     age 
 John     0
 John     0
 John     1
 John     2
 Emma     0
 Emma     0
 Emma     0
 Emma     0
 Edward   0
 Edward   0
 Edward   0
 Edward   1

这能帮你解决问题吗

library(dplyr)

df %>% 
  group_by(person) %>% 
  arrange(person, tid) %>%
  mutate(active_dummy = if_else(lag(cumsum(active)) > 0, 1, 0, 0),
         age = cumsum(active_dummy)) %>% 
  select(person, age)
这给了你

# A tibble: 12 x 2
# Groups:   person [3]
   person   age
   <chr>  <dbl>
 1 John      0.
 2 John      0.
 3 John      1.
 4 John      2.
 5 Emma      0.
 6 Emma      0.
 7 Emma      0.
 8 Emma      0.
 9 Edward    0.
10 Edward    0.
11 Edward    0.
12 Edward    1.
#一个tible:12 x 2
#组别:人[3]
人龄
1约翰0。
2约翰0。
3约翰1。
约翰。
5艾玛0。
6艾玛0。
7艾玛0。
8艾玛0。
9.0。
10.0。
11.0。
12爱德华1。

这能帮你解决问题吗

library(dplyr)

df %>% 
  group_by(person) %>% 
  arrange(person, tid) %>%
  mutate(active_dummy = if_else(lag(cumsum(active)) > 0, 1, 0, 0),
         age = cumsum(active_dummy)) %>% 
  select(person, age)
这给了你

# A tibble: 12 x 2
# Groups:   person [3]
   person   age
   <chr>  <dbl>
 1 John      0.
 2 John      0.
 3 John      1.
 4 John      2.
 5 Emma      0.
 6 Emma      0.
 7 Emma      0.
 8 Emma      0.
 9 Edward    0.
10 Edward    0.
11 Edward    0.
12 Edward    1.
#一个tible:12 x 2
#组别:人[3]
人龄
1约翰0。
2约翰0。
3约翰1。
约翰。
5艾玛0。
6艾玛0。
7艾玛0。
8艾玛0。
9.0。
10.0。
11.0。
12爱德华1。

另一种解决方案也可以完成此任务:

library(tidyverse)

age_counter = df %>% 
    arrange(tid) %>%
    group_by(person) %>% 
    filter(cumsum(active) > 0) %>% 
    mutate(age = row_number() - 1)

df %>% 
    left_join(age_counter) %>%
    replace_na(list(age = 0)) %>%
    select(person, age)

另一种解决方案也可以完成这项工作:

library(tidyverse)

age_counter = df %>% 
    arrange(tid) %>%
    group_by(person) %>% 
    filter(cumsum(active) > 0) %>% 
    mutate(age = row_number() - 1)

df %>% 
    left_join(age_counter) %>%
    replace_na(list(age = 0)) %>%
    select(person, age)

你试过什么?请给我们一个你尝试过的一些策略/代码的例子John不是应该是0,0,1,1吗?不,应该是0,0,1,2,因为他的年龄将在后期增加到下一个值,即在tid 1中他是0,2中他仍然是0,因为他变得活跃,3中他得到1,4中他得到2你尝试过什么?请给我们一个你尝试过的一些策略/代码的例子John不是应该是0,0,1,1吗?不应该是0,0,1,2,因为他的年龄将在后期增加到下一个值,即在tid 1中他是0,2中他仍然是0,因为他变得活跃,在3中他得到1,4中他得到2为什么你有>0,1,0,0?它不够通用,当活动总和=1,然后递增时,它应该是0。谢谢,它起作用了,你需要添加排列(tid)使它更通用。为什么这里有>0,1,0,0?它不够通用,当活动总和=1时,它应该为0,然后递增。谢谢,它起作用了,您需要添加排列(tid)使其更通用