首页 文章

如何使用R 3.3.2根据列值将索引列添加到数据帧? [重复]

提问于
浏览
-2

这个问题在这里已有答案:

问题

如果在列中给出分类值,如何在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 回答

  • 3

    dplyr有一个专门的功能,row_number

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

    使用 dplyr 包,这非常简单 .

    假设您的数据帧被称为 df ,这将起到作用:

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

    我们的想法是为每个组(由 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) . 有些人喜欢它,有些人讨厌它!

  • 1

    这是基础R解决方案(类似于 Additional Notes 中提到的方法)

    do.call(rbind, lapply(split(df, df$cat), function(x) cbind(x, rank = seq_along(x$id))))
    

相关问题