如何解决使用groupby和fill的R条件变异日期列 数据
措辞类似的问题在那里,但没有一个显示出我想要做的事情。我在下面有一个数据框示例。我想group_by ID并创建一个Date2列,其中rank = 2。我很难解决这个问题。
ID Rank Date Date2
1 5678 1 2000-01-01 2010-05-02
2 5678 2 2010-05-02 2010-05-02
3 1234 1 2000-01-01 2015-06-03
4 1234 2 2015-06-03 2015-06-03
这是我到目前为止所拥有的:
df <- df %>% group_by(ID) %>%fill(Date2,.direction='up')
我该怎么办?
解决方法
尝试一下:
library(dplyr)
#Code
df %>% group_by(ID) %>% mutate(Date2=Date[Rank==2])
输出:
# A tibble: 4 x 4
# Groups: ID [2]
ID Rank Date Date2
<int> <int> <chr> <chr>
1 5678 1 2000-01-01 2010-05-02
2 5678 2 2010-05-02 2010-05-02
3 1234 1 2000-01-01 2015-06-03
4 1234 2 2015-06-03 2015-06-03
使用了一些数据:
#Data
df <- structure(list(ID = c(5678L,5678L,1234L,1234L),Rank = c(1L,2L,1L,2L),Date = c("2000-01-01","2010-05-02","2000-01-01","2015-06-03")),row.names = c("1","2","3","4"),class = "data.frame")
如果您想使用fill()
,也可以尝试以下代码。您将必须使用ifelse()
之类的条件来分配日期,然后填写值:
#Code 2
df %>% group_by(ID) %>%
mutate(Date2=ifelse(Rank==2,Date,NA)) %>%
fill(Date2,.direction = 'up')
输出:
# A tibble: 4 x 4
# Groups: ID [2]
ID Rank Date Date2
<int> <int> <chr> <chr>
1 5678 1 2000-01-01 2010-05-02
2 5678 2 2010-05-02 2010-05-02
3 1234 1 2000-01-01 2015-06-03
4 1234 2 2015-06-03 2015-06-03
,
我们可以按“ ID”分组,并使用逻辑表达式获取相应的“ Date1”
library(dplyr)
df %>%
group_by(ID) %>%
mutate(Date2 = Date[Rank == 2][1])
# A tibble: 4 x 4
# Groups: ID [2]
# ID Rank Date Date2
# <int> <int> <chr> <chr>
#1 5678 1 2000-01-01 2010-05-02
#2 5678 2 2010-05-02 2010-05-02
#3 1234 1 2000-01-01 2015-06-03
#4 1234 2 2015-06-03 2015-06-03
或者另一种选择是使用match
df %>%
group_by(ID) %>%
mutate(Date2 = Date[match(2,Rank)])
或使用data.table
library(data.table)
setDT(df)[,Date2 := Date[match(2,Rank)],ID]
或与base R
df$Date2 <- with(df,rep(Date[Rank == 2],table(ID)))
数据
df <- structure(list(ID = c(5678L,class = "data.frame")