首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一列唯一标识符,并按主题排序

创建一列唯一标识符,并按主题排序
EN

Stack Overflow用户
提问于 2017-03-20 21:40:03
回答 1查看 26关注 0票数 0

我有一个数据集,在这里我试图按照主题的观察来排序,然后创建一个列来提供他们的出生年份。数据如下:

代码语言:javascript
复制
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包来创建每个观察对象的序列,如下所示:

代码语言:javascript
复制
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“的列,它表示为该人在数据库中的第一年。所以看起来是这样:

代码语言:javascript
复制
         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中完成这些任务,还是需要编写特定的函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-20 21:51:05

下面是一种使用lag函数的方法。注意,我们需要用FALSE替换第一个实例(即NA)。lag函数的使用允许我们检查Name是否与前一个Name匹配。

这个解决方案假设,如果名称不是分组在一起的,那么它们就是不同的人。

代码语言:javascript
复制
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      1997
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42914454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档