如何根据列的值对观察值重新编号[重复]

Posted

技术标签:

【中文标题】如何根据列的值对观察值重新编号[重复]【英文标题】:How to renumber the observations based on the value of a column [duplicate] 【发布时间】:2019-05-04 08:11:37 【问题描述】:

下面是我的数据的简化示例,new 列是我要添加到数据集中的列。基本上,我想使用 1,2,3,4... 重命名riskset,这样我可以更轻松地进行循环。 riskset 中的数字已排序,它们不连续,riskset 中存在重复数字(每个唯一数字 10~11),所以如何添加另一列根据它们的 riskset 数字分组观察?

  riskset            new
a.0000000017          1
a.0000000017          1
a.0000000017          1
a.0000000017          1
a.0000000066          2
a.0000000066          2
a.0000000066          2
a.0000000066          2
a.0000000099          3
a.0000000099          3
a.0000000099          3
a.0000000099          3
a.0000000099          3
              ......

【问题讨论】:

【参考方案1】:

一个简单的基本 R 解决方案是使用 factors 然后转换 as.integer

as.integer(as.factor(df$riskset))
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 3

或者因为您要求提供dplyr 选项

df %>% mutate(new = as.integer(as.factor(riskset)))

或使用transform的基本R等效项

transform(df, new = as.integer(as.factor(riskset)))

另一种选择是使用dplyr::lagcumsum

df %>% mutate(new = cumsum(riskset != lag(riskset, default = T)) + 1)

或者既然你提到了group_by,你可以这样做

df %>% group_by(riskset) %>% group_indices()

生成组索引。

group_indices 也适用于mutate

df %>% group_by(riskset) %>% mutate(new = group_indices())

样本数据

df <- read.table(text =
    "  riskset            new
a.0000000017          1
a.0000000017          1
a.0000000017          1
a.0000000017          1
a.0000000066          2
a.0000000066          2
a.0000000066          2
a.0000000066          2
a.0000000099          3
a.0000000099          3
a.0000000099          3
a.0000000099          3
a.0000000099          3", header = T)

【讨论】:

以上是关于如何根据列的值对观察值重新编号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据一列中的值对数据表行重新排序

如何根据特定列的值重新排列数据框的行

根据来自不同列的 2 个其他值对列的值求和

如何根据列的值对熊猫数据框中的列进行分类?

Excel中如何根据某一列的值对整行进行颜色填充?

在 R 中,如何根据一列的值对所有其他列求和,而不指定列名?