我有一个简单的数据框,包含两个变量,RowID和Country:
RowID Country
1 USA
2 Spain
3 USA
4 USA
5 Spain
6 Spain
我可以使用剪切功能使用
为完整数据创建容器df$Bin<-cut(df$RowID,breaks=3)
产生:
RowID Country Bin
1 USA 1
2 Spain 1
3 USA 2
4 USA 2
5 Spain 3
6 Spain 3
但是,是否可以在变量Country的每个级别中应用cut函数?
换句话说,最后是:
RowID Country Bin
1 USA 1
2 Spain 1
3 USA 2
4 USA 3
5 Spain 2
6 Spain 3
答案 0 :(得分:3)
您可以使用dplyr
执行以下操作library(dplyr)
df %>%
group_by(Country) %>%
mutate(Bin = row_number()) %>%
ungroup
输出
##Source: local data frame [6 x 3]
##
## RowID Country Bin
## (int) (chr) (int)
##1 1 USA 1
##2 2 Spain 1
##3 3 USA 2
##4 4 USA 3
##5 5 Spain 2
##6 6 Spain 3
修改强>
对于评论中提出的问题,关于如何将每个国家分成多个分区(例如,如果一个国家有100行要分解为10个分箱),可以使用以下代码< / p>
break_count <- 2
df3 %>%
group_by(Country) %>%
mutate(Bin = cut(row_number(), break_count)) %>%
ungroup
上面使用了break_count
,但可以更改。只有mutate
行与解决方案的第一个版本不同。
答案 1 :(得分:0)
我们可以使用ave
df$Bin <- with(df, ave(RowID, Country, FUN=seq_along))