使用数据框列的级别添加一个新列,其中每个级别都有一个唯一的递增编号

时间:2018-03-06 20:42:35

标签: r dataframe

我尝试在数据框中创建一个新列,其中包含基于不同列级别的递增数字。也就是说,我想重命名列的级别,以便每个级别都有一个唯一的递增数字。

df <- data.frame(y1 = c(100, 100, 100, 200, 200, 500, 500, 500),
                 y2 = c(6, 5, 4, 2, 5, 4, 3, 2))
df$y1 <- as.factor(df$y1)
levels(df$y1) ## [1] "100" "200" "500"

预期输出:新的y3列,其新级别名称基于y1的级别。 &#34; b&#34;没有必要,我可以稍后补充一下。

y1    y2    y3
100   6     b1
100   5     b1
100   4     b1
200   2     b2
200   5     b2
500   4     b3
500   3     b3
500   2     b3

我已经和lapply以及各种for循环搞混了,但我真的不知道我在这做什么......这样的事情:< / p>

for (i in levels(df$y1)){
    batchnum <- 1
    if (i == df$y1){
        df$y3 <- paste0("b", batchnum)
        batchnum <- batchnum + 1
    }
}   

这只是用&#34; b1&#34;标记y3。对于每一行,我想因为if没有矢量化或什么?

## Warning messages:
1: In if (i == df$y1) { :
  the condition has length > 1 and only the first element will be used

5 个答案:

答案 0 :(得分:3)

使用data.table

library(data.table)

setDT(df)
df[, y3 := .GRP, by = y1]
df[, y3 := paste0("b", y3)] # you can change "b" with whatever you want

    y1 y2 y3
1: 100  6 b1
2: 100  5 b1
3: 100  4 b1
4: 200  2 b2
5: 200  5 b2
6: 500  4 b3
7: 500  3 b3
8: 500  2 b3

答案 1 :(得分:3)

Refresh方法:

dplyr

或者您也这样做:

require(dplyr);
df %>% mutate(y3 = paste0("b", as.numeric(y1)));
#   y1 y2 y3
#1 100  6 b1
#2 100  5 b1
#3 100  4 b1
#4 200  2 b2
#5 200  5 b2
#6 500  4 b3
#7 500  3 b3
#8 500  2 b3

答案 2 :(得分:3)

最直接,最简单的方法(利用as.numeric将生成与因子水平相对应的数字的事实):

df$y3 <- paste0('b', as.numeric(df$y1))

如果不清楚为什么会这样,请单独查看以下代码:

as.numeric(df$y1)

答案 3 :(得分:1)

以这种方式:

x <- c(100,100,100,200,200,500,500,500)
paste0("b",rep(seq_along(table(x)),table(x)))
[1] "b1" "b1" "b1" "b2" "b2" "b3" "b3" "b3"

答案 4 :(得分:1)

可以使用group_indices中的dplyr函数创建新列:

library(dplyr)
df %>% mutate(y3 = paste0("b", group_indices(.,y1)))

#   y1 y2 y3
#1 100  6 b1
#2 100  5 b1
#3 100  4 b1
#4 200  2 b2
#5 200  5 b2
#6 500  4 b3
#7 500  3 b3
#8 500  2 b3