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