请参阅答案末尾以获得更好的方法,这是为了轻松理解步骤。
我不确定你愿意做什么,但也许是这样:
df2<- as.data.frame( lapply( df, function(x){
as.integer( cut(x, quantile(x, probs=(0:5)/5, na.rm=T)))
}))
colnames(df2) <- paste0("quartile_",colnames(df))
df3 <- cbind(df,df2)
这使:
A B C quartile_A quartile_B quartile_C
1 0.6057 0.1644 6.93 4 5 4
2 0.5723 0.1170 6.59 4 2 3
3 0.5614 0.1552 7.02 3 4 5
4 0.4102 0.1059 5.24 NA 2 1
5 0.4945 0.0857 6.64 1 1 4
6 0.5157 0.0747 7.06 2 NA 5
7 0.7785 0.1394 5.21 5 3 NA
8 0.5492 0.1557 6.06 3 4 2
9 0.5411 0.1884 5.68 2 5 2
10 0.6622 0.1480 6.10 5 3 3
使用数据:
> dput(df)
structure(list(A = c(0.6057, 0.5723, 0.5614, 0.4102, 0.4945,
0.5157, 0.7785, 0.5492, 0.5411, 0.6622), B = c(0.1644, 0.117,
0.1552, 0.1059, 0.0857, 0.0747, 0.1394, 0.1557, 0.1884, 0.148
), C = c(6.93, 6.59, 7.02, 5.24, 6.64, 7.06, 5.21, 6.06, 5.68,
6.1)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA,
-10L))
根据下面的 @DavidArenburg 评论,实现相同结果的更好方法是:
df[paste0("quartile_",colnames(df))] <- lapply(df, function(x) as.integer(cut(x, quantile(x, probs=(0:5)/5, na.rm = TRUE))))
这可以避免创建新的数据框并在最后复制它。