添加带有mutate和group by的新列
我想基于以前的列和group by函数创建一个名为age的新列。数据集如下所示:添加带有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
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)使其更通用