这个问题在这里已有答案:
问题
如果在列中给出分类值,如何在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
. 我尝试了以下方法:
-
aggregate(df,by = c('A','B','C'),length)
-
开始编写自定义函数以使用lapply,但遇到了太多的边界情况 .
这给了我不匹配的长度错误 . 显然,这里的想法是获取每个组的计数,然后编写一个函数,可以使用lapply获取行值并继续计数直到我达到长度 .
附加说明
我正在考虑放弃上述想法,并通过cat值将数据帧拆分为单独的较小数据帧 . 然后,我将为索引的每个数据帧创建一个rank变量 . 接下来的挑战是,将所有数据帧值与新秩列组合回一个数据帧的好方法是什么?
尽管如此,这一切都与我无关 . 坦率地说,我的直觉说我做错了 . 我这太难了吗?是否有一个包或R技巧可以很容易地做到这一点?如果这看起来很愚蠢,我道歉,但如果不寻求R程序员比我更熟练的建议,我就不能进一步清醒 .
3 回答
dplyr有一个专门的功能,row_number:
使用
dplyr
包,这非常简单 .假设您的数据帧被称为
df
,这将起到作用:我们的想法是为每个组(由
cat
的值定义,cf调用group_by
)创建一个变量(使用mutate
),作为向量1:n()
,其中n()
是组中观察的数量 .管道
%>%
是避免嵌套函数调用的快捷方式 .x %>% f
表示f(x)
,x %>% f(y)
表示f(x,y) . 所以x %>% f(y) %>% g(z)
表示g(f(x, y), z)
. 有些人喜欢它,有些人讨厌它!这是基础R解决方案(类似于 Additional Notes 中提到的方法)