为自基础观察以来的年数创建计数变量
Creating a count variable for number of years since a base observation
我需要创建一个变量来告诉我自第一次观察特定组 conflictID 以来的年数。我提供了一个示例数据集来说明我的问题。
conflictID <- c(205,205,205,209,209,221,221,221,221)
year <- c("1993", "1995", "1996", "1991", "1993", "2001", "2002", "2003", "2005")
df <- data.frame(conflictID, year)
这个数据框的输出是:
conflictID year
1 205 1993
2 205 1995
3 205 1996
4 209 1991
5 209 1993
6 221 2001
7 221 2002
8 221 2003
9 221 2005
我想要这样的东西:
conflictID year duration
1 205 1993 0
2 205 1995 2
3 205 1996 3
4 209 1991 0
5 209 1993 2
6 221 2001 0
7 221 2002 1
8 221 2003 2
9 221 2005 4
对于每个 conflictid 的第一次观察,duration 变量为 0。基本上,我需要的是一种为每个 conflictID 的第一年设置基准日期的方法,如果这有意义的话?
我们可以使用 dplyr
库。 df2
是最终输出。
library(dplyr)
df2 <- df %>%
mutate(year = as.numeric(as.character(year))) %>%
group_by(conflictID) %>%
mutate(duration = year - min(year))
df2
# A tibble: 9 x 3
# Groups: conflictID [3]
conflictID year duration
<dbl> <dbl> <dbl>
1 205 1993 0
2 205 1995 2
3 205 1996 3
4 209 1991 0
5 209 1993 2
6 221 2001 0
7 221 2002 1
8 221 2003 2
9 221 2005 4
请注意,您的 year
列采用 factor
格式,这很难处理。我建议您在创建数据框时以 numeric
格式维护年份列。请看下面的例子。如果您在年份列中删除引号。您的代码不需要 mutate(year = as.numeric(as.character(year)))
。
conflictID <- c(205,205,205,209,209,221,221,221,221)
year <- c(1993, 1995, 1996, 1991, 1993, 2001, 2002, 2003, 2005)
df <- data.frame(conflictID, year)
基本 R 中的一行...
df$year <- as.numeric(as.character(df$year)) #your years are factors
df$duration <- df$year - ave(df$year, df$conflictID, FUN=min)
df
conflictID year duration
1 205 1993 0
2 205 1995 2
3 205 1996 3
4 209 1991 0
5 209 1993 2
6 221 2001 0
7 221 2002 1
8 221 2003 2
9 221 2005 4
data.table
中的另一行
library(data.table)
setDT(df)[, duration := year - min(year), conflictID]
df
# conflictID year duration
#1: 205 1993 0
#2: 205 1995 2
#3: 205 1996 3
#4: 209 1991 0
#5: 209 1993 2
#6: 221 2001 0
#7: 221 2002 1
#8: 221 2003 2
#9: 221 2005 4
我需要创建一个变量来告诉我自第一次观察特定组 conflictID 以来的年数。我提供了一个示例数据集来说明我的问题。
conflictID <- c(205,205,205,209,209,221,221,221,221)
year <- c("1993", "1995", "1996", "1991", "1993", "2001", "2002", "2003", "2005")
df <- data.frame(conflictID, year)
这个数据框的输出是:
conflictID year
1 205 1993
2 205 1995
3 205 1996
4 209 1991
5 209 1993
6 221 2001
7 221 2002
8 221 2003
9 221 2005
我想要这样的东西:
conflictID year duration
1 205 1993 0
2 205 1995 2
3 205 1996 3
4 209 1991 0
5 209 1993 2
6 221 2001 0
7 221 2002 1
8 221 2003 2
9 221 2005 4
对于每个 conflictid 的第一次观察,duration 变量为 0。基本上,我需要的是一种为每个 conflictID 的第一年设置基准日期的方法,如果这有意义的话?
我们可以使用 dplyr
库。 df2
是最终输出。
library(dplyr)
df2 <- df %>%
mutate(year = as.numeric(as.character(year))) %>%
group_by(conflictID) %>%
mutate(duration = year - min(year))
df2
# A tibble: 9 x 3
# Groups: conflictID [3]
conflictID year duration
<dbl> <dbl> <dbl>
1 205 1993 0
2 205 1995 2
3 205 1996 3
4 209 1991 0
5 209 1993 2
6 221 2001 0
7 221 2002 1
8 221 2003 2
9 221 2005 4
请注意,您的 year
列采用 factor
格式,这很难处理。我建议您在创建数据框时以 numeric
格式维护年份列。请看下面的例子。如果您在年份列中删除引号。您的代码不需要 mutate(year = as.numeric(as.character(year)))
。
conflictID <- c(205,205,205,209,209,221,221,221,221)
year <- c(1993, 1995, 1996, 1991, 1993, 2001, 2002, 2003, 2005)
df <- data.frame(conflictID, year)
基本 R 中的一行...
df$year <- as.numeric(as.character(df$year)) #your years are factors
df$duration <- df$year - ave(df$year, df$conflictID, FUN=min)
df
conflictID year duration
1 205 1993 0
2 205 1995 2
3 205 1996 3
4 209 1991 0
5 209 1993 2
6 221 2001 0
7 221 2002 1
8 221 2003 2
9 221 2005 4
data.table
library(data.table)
setDT(df)[, duration := year - min(year), conflictID]
df
# conflictID year duration
#1: 205 1993 0
#2: 205 1995 2
#3: 205 1996 3
#4: 209 1991 0
#5: 209 1993 2
#6: 221 2001 0
#7: 221 2002 1
#8: 221 2003 2
#9: 221 2005 4