【问题标题】:How to use R 3.3.2 to add index column to dataframe based on column value? [duplicate]如何使用 R 3.3.2 根据列值将索引列添加到数据框? [复制]
【发布时间】:2017-02-27 16:02:35
【问题描述】:

问题

在给定列中的分类值的情况下,如何在 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 值拆分为单独的较小数据帧。然后,我将为每个索引的数据框创建一个排名变量。那么挑战就变成了,将所有数据帧值组合回一个具有新排名列的数据帧的好方法是什么?

不过,这些都不适合我。坦率地说,我的直觉告诉我我做错了。我做这太难了吗?是否有一个包或 R 技巧可以轻松做到这一点?如果这看起来很愚蠢,我深表歉意,但如果不寻求比我更熟练的 R 程序员的建议,我就不能有意识地继续前进。

【问题讨论】:

  • 这个? ave(1:nrow(d), d$cat, FUN = seq_along)
  • 如果您指的是id 列的实际分组排名,df$rank <- ave(df$id, df$cat, FUN = rank)
  • @OliverFrost 恕我直言,虽然我承认你非常相似,但我正在尝试基于列值的索引排名,并且用例与我的不同。谢谢你的链接。
  • 我为所有评论的人投了赞成票。一旦我能够测试,我会标记答案。谢谢大家的帮助。我对这些亲切的回应感到不知所措和谦卑。

标签: r indexing dataframe


【解决方案1】:

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)。有人喜欢有人讨厌!

    【讨论】:

    • 使用rank 可能更安全,即mutate(rank = rank(id))dplyr::dense_rank
    【解决方案3】:

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

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

    【讨论】:

    • ave 更简单。
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2021-06-17
    • 2020-02-16
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多