如果在列中给出分类值,如何在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
。我尝试了以下方法:
这给了我不匹配的长度错误。显然,这里的想法是获取每个组的计数,然后编写一个函数,可以使用lapply获取行值并继续计数直到我达到长度。
我正在考虑放弃上述想法,并通过cat值将数据帧拆分为单独的较小数据帧。然后,我将为索引的每个数据帧创建一个rank变量。接下来的挑战是,将所有数据帧值与新秩列组合回一个数据帧的好方法是什么?
尽管如此,这一切都与我无关。坦率地说,我的直觉说我做错了。我这太难了吗?是否有一个包或R技巧可以很容易地做到这一点?如果这看起来很愚蠢,我道歉,但如果不寻求R程序员比我更熟练的建议,我就不能进一步清醒。
答案 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 %>% f
,f(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>