我有一个数据集,在这里我试图按照主题的观察来排序,然后创建一个列来提供他们的出生年份。数据如下:
Name <- c("Joe Smith", "Joe Smith","Joe Smith","Joe Smith", "Tom Watson", "Tom Watson", "Tom Watson", "Carl Nelle", "Carl Nelle", "Carl Nelle", "Carl Nelle", "Joe Smith", "Joe Smith", "Joe Smith", "Joe Smith")
Year <- c(2001, 2002, 2003, 2004, 2014, 2015, 2016, 2006, 2007, 2008, 2009, 1997, 1998, 1999, 2000)
Var1 <- round(rnorm(n = Name, mean = 10, sd = 2),1)
Var2 <- round(rnorm(n = Name, mean = 30, sd = 10),0)
data <- data.frame(Name, Year, Var1, Var2)
data
Name Year Var1 Var2
1 Joe Smith 2001 8.9 23
2 Joe Smith 2002 9.8 45
3 Joe Smith 2003 11.1 43
4 Joe Smith 2004 11.7 63
5 Tom Watson 2014 11.7 47
6 Tom Watson 2015 13.2 28
7 Tom Watson 2016 9.5 30
8 Carl Nelle 2006 9.5 44
9 Carl Nelle 2007 11.2 32
10 Carl Nelle 2008 12.2 24
11 Carl Nelle 2009 5.6 15
12 Joe Smith 1997 10.5 38
13 Joe Smith 1998 10.3 14
14 Joe Smith 1999 9.2 27
15 Joe Smith 2000 7.1 49我使用dplyr包来创建每个观察对象的序列,如下所示:
data <- data %>%
group_by(Name) %>%
mutate(id = row_number())
Name Year Var1 Var2 id
1 Joe Smith 2001 8.9 23 1
2 Joe Smith 2002 9.8 45 2
3 Joe Smith 2003 11.1 43 3
4 Joe Smith 2004 11.7 63 4
5 Tom Watson 2014 11.7 47 1
6 Tom Watson 2015 13.2 28 2
7 Tom Watson 2016 9.5 30 3
8 Carl Nelle 2006 9.5 44 1
9 Carl Nelle 2007 11.2 32 2
10 Carl Nelle 2008 12.2 24 3
11 Carl Nelle 2009 5.6 15 4
12 Joe Smith 1997 10.5 38 5
13 Joe Smith 1998 10.3 14 6
14 Joe Smith 1999 9.2 27 7
15 Joe Smith 2000 7.1 49 8我的第一个问题是,第二个乔·史密斯没有自己的身份证号码。这是一个问题,因为数据集中的几个人可以有相同的名称。有办法纠正这个问题吗?
第二个问题是,我需要创建一个名为"Birth.Year“的列,它表示为该人在数据库中的第一年。所以看起来是这样:
Name Year Var1 Var2 id Birth.Year
1 Joe Smith 2001 8.9 23 1 2001
2 Joe Smith 2002 9.8 45 2 2001
3 Joe Smith 2003 11.1 43 3 2001
4 Joe Smith 2004 11.7 63 4 2001
5 Tom Watson 2014 11.7 47 1 2014
6 Tom Watson 2015 13.2 28 2 2014
7 Tom Watson 2016 9.5 30 3 2014
8 Carl Nelle 2006 9.5 44 1 2006
9 Carl Nelle 2007 11.2 32 2 2006
10 Carl Nelle 2008 12.2 24 3 2006
11 Carl Nelle 2009 5.6 15 4 2006
12 Joe Smith 1997 10.5 38 5 1997
13 Joe Smith 1998 10.3 14 6 1997
14 Joe Smith 1999 9.2 27 7 1997
15 Joe Smith 2000 7.1 49 8 1997是否有办法在dplyr中完成这些任务,还是需要编写特定的函数?
发布于 2017-03-20 21:51:05
下面是一种使用lag函数的方法。注意,我们需要用FALSE替换第一个实例(即NA)。lag函数的使用允许我们检查Name是否与前一个Name匹配。
这个解决方案假设,如果名称不是分组在一起的,那么它们就是不同的人。
data <- data.frame(Name, Year, Var1, Var2, stringsAsFactors = FALSE)
data %>%
mutate(Foo1 = Name != lag(Name),
Foo2 = cumsum(ifelse(is.na(Foo1), FALSE, Foo1))) %>%
group_by(Name, Foo2) %>%
mutate(id = row_number(),
BirthYear = min(Year))
Name Year Var1 Var2 Foo1 Foo2 id BirthYear
<chr> <dbl> <dbl> <dbl> <lgl> <int> <int> <dbl>
1 Joe Smith 2001 9.0 30 NA 0 1 2001
2 Joe Smith 2002 11.8 47 FALSE 0 2 2001
3 Joe Smith 2003 6.9 23 FALSE 0 3 2001
4 Joe Smith 2004 8.6 37 FALSE 0 4 2001
5 Tom Watson 2014 10.7 35 TRUE 1 1 2014
6 Tom Watson 2015 9.4 30 FALSE 1 2 2014
7 Tom Watson 2016 7.5 25 FALSE 1 3 2014
8 Carl Nelle 2006 10.7 32 TRUE 2 1 2006
9 Carl Nelle 2007 6.6 25 FALSE 2 2 2006
10 Carl Nelle 2008 10.9 34 FALSE 2 3 2006
11 Carl Nelle 2009 13.5 18 FALSE 2 4 2006
12 Joe Smith 1997 10.1 34 TRUE 3 1 1997
13 Joe Smith 1998 12.0 34 FALSE 3 2 1997
14 Joe Smith 1999 7.3 40 FALSE 3 3 1997
15 Joe Smith 2000 10.8 26 FALSE 3 4 1997https://stackoverflow.com/questions/42914454
复制相似问题