如何使用R 3.3.2根据列值将索引列添加到数据框?

时间:2017-02-27 16:02:35

标签: r indexing dataframe

问题

如果在列中给出分类值,如何在R的数据框中创建索引列?

换句话说,假设我们有一个数据帧如下:

id cat 
1  A 
2  A 
3  A
4  B 
5  B 
6  C
7  C 
8  C 
9  C
10 C

我们如何创建一个名为rank的列,执行以下操作:

id cat rank 
1  A   1 
2  A   2
3  A   3 
4  B   1 
5  B   2 
6  C   1 
7  C   2
8  C   3
9  C   4 
10 C   5

尝试

假设数据框名为df。我尝试了以下方法:

  • 聚合(df,by = c('A','B','C'),长度)
  • 开始编写自定义函数以使用lapply,但遇到了太多的边界情况。

这给了我不匹配的长度错误。显然,这里的想法是获取每个组的计数,然后编写一个函数,可以使用lapply获取行值并继续计数直到我达到长度。

附加说明

我正在考虑放弃上述想法,并通过cat值将数据帧拆分为单独的较小数据帧。然后,我将为索引的每个数据帧创建一个rank变量。接下来的挑战是,将所有数据帧值与新秩列组合回一个数据帧的好方法是什么?

尽管如此,这一切都与我无关。坦率地说,我的直觉说我做错了。我这太难了吗?是否有一个包或R技巧可以很容易地做到这一点?如果这看起来很愚蠢,我道歉,但如果不寻求R程序员比我更熟练的建议,我就不能进一步清醒。

3 个答案:

答案 0 :(得分:3)

dplyr有一个专门的功能,row_number

df %>%
    group_by(cat) %>%
    mutate(rank = row_number())

答案 1 :(得分:2)

使用dplyr包,这非常简单。

假设您的数据帧被称为df,这将解决问题:

df %>%
  group_by(cat) %>%
  mutate(rank=1:n())

我们的想法是为每个组(由mutate的值定义,cf调用cat)创建一个变量(group_by),作为向量{ {1}}其中1:n()是组中观察的数量。

管道n()是避免嵌套函数调用的快捷方式。 %>%表示x %>% ff(x)表示f(x,y)。因此x %>% f(y)表示x %>% f(y) %>% g(z)。有些人喜欢它,有些人讨厌它!

答案 2 :(得分:1)

这是基础R解决方案(类似于附加说明中提到的方法)

<section id="last">

        <div class="row">
            <div class="col-lg-9 col-md-8 col-sm-12 col-xs-12 newswidth">                   
                <div id="news-wrap">
                    <div id="owl-example" class="owl-carousel owl-theme">
                        <!--item-->
                        @{  var counter = 0;}
                        @foreach (var itemBlogList in Model.BlogList)
                        {

                            if (counter == 4)
                            {
                                break;
                            }
                            <div class="info">
                                <a href="@itemBlogList.Link" class="title">@itemBlogList.Title</a>
                                <div class="credentials">
                                    <div class="author">PETER SCHULTZ</div>
                                    <div class="date">@itemBlogList.PublishDate</div>
                                </div>
                                <div class="cut">
                                    @Html.Raw(@itemBlogList.Text)
                                </div>
                            </div>
                            counter++;
                        }

                    </div>
                </div>
            </div>

            </div>
</section>