请问如何用R语言,对一列数按照从上到下,元素和大致相等,分成十份,并标记成1 111 222 333 444 55 ……101010
请问如何用R语言,对一列数按照从上到下,元素和大致相等,分成十份
- 已编辑
这个问题我很感兴趣。能否提供一个可以重现问题的数据和代码示例,让我直接拷贝粘贴就能运行?最好附带 session_info()
信息。
提问题的方式可以参考“新手须知 1.2 正确的发帖姿势”。
IDnumber <- c(1,3,5,6,2,19,10)
population <- c(1,4,5,9,8,0,7)
patientdata <- data.frame(IDnumber,population)
patientdata
newdata <- patientdata[order(patientdata$IDnumber),]
newdata #这是原来的数据
newdata$result <- c(1,1,2,2,3,4,4)
newdata #这是示例的结果,比如我想把它分成第二列元素和大致相等的四份,它将第二列分成和大致相等的四份,并从1到4标示哪些成为一类。
dapengde >
sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=Chinese (Simplified)China.936
[2] LC_CTYPE=Chinese (Simplified)China.936
[3] LC_MONETARY=Chinese (Simplified)China.936
[4] LC_NUMERIC=C
[5] LC_TIME=Chinese (Simplified)China.936
attached base packages:
[1] stats graphics grDevices utils datasets methods
[7] base
other attached packages:
[1] sp_1.3-1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.0 compiler_3.5.1 pillar_1.3.0
[4] later_0.7.5 plyr_1.8.4 bindr_0.1.1
[7] tools_3.5.1 digest_0.6.18 tibble_1.4.2
[10] gtable_0.2.0 lattice_0.20-35 pkgconfig_2.0.2
[13] rlang_0.3.0.1 shiny_1.2.0 rstudioapi_0.8
[16] crosstalk_1.0.0 bindrcpp_0.2.2 dplyr_0.7.8
[19] htmlwidgets_1.3 leaflet_2.0.2 grid_3.5.1
[22] tidyselect_0.2.5 glue_1.3.0 R6_2.3.0
[25] ggplot2_3.1.0 purrr_0.2.5 magrittr_1.5
[28] scales_1.0.0 promises_1.0.1 htmltools_0.3.6
[31] rsconnect_0.4.1.4 assertthat_0.2.0 mime_0.6
[34] xtable_1.8-3 colorspace_1.3-2 httpuv_1.4.5.1
[37] lazyeval_0.2.1 munsell_0.5.0 crayon_1.3.4
- 已编辑
13520982976 谢谢提供的示例。你看这样行不行:
as.numeric(cut(1:nrow(newdata), 4))
13520982976 建议你真的多看两眼左上角的新手须知,把自己的发帖整的清楚漂亮些,这样可以减少对话次数,提高效率,节约彼此的时间
Cloud2016 请问如何指定某列呢?因为我的数据有很多列,需要根据不同列分组
dapengde 您好,如果我有多个列,想按照不同的列进行分组,那么如何指定某个列呢,您给的答案特别好,就是没有指定某个列,所以希望您能给一些提示。
dapengde 您好,那如何分成将一组数,分成个数大体相等的四份呢?并能标示出来
13520982976 见5楼。
dapengde 你好,你的代码好像运行不了,而且给的第一个代码好像没有逻辑,不知讲的是什么,希望您能多指教,我希望就是按某一列原来的顺序,分成四份,第一份的元素和基本相等。
dapengde 你的代码运行的结果不是我期望的,如果分成三份,两份,那么他们的元素和会基本一样吗,显然,你的运算是按我的结果算的,并不是按要求进行的。
到底是要个数相似还是元素和相似
- 已编辑
a <- c(2,3,1,4,2,2)
# 把这组数分成三份
# 每一份的元素和基本相等
# 想要的结果是 b<- c(1,1,2,2,3,3)
# 因为前两个和中间两个和后三个的和基本相等
a <- c(2,3,1,4,2,2)
a1 <- cumsum(a)
a1
n=3
for(z in 1:n){
for(i in 1:length(a1)){
if(a1[i] <= a1[which(abs(a1-sum(a)/n)==min(abs(a1-sum(a)/n)))]*z)print(z)
}
}
这是我试着写的,有一些错误,希望您能帮个忙
- 已编辑
使用cumsum(a)/n
的思路大方向是对的,试试这个:
library(tidyverse)
# data
set.seed(123)
a = c(2,3,1,4,2,2)
# number of groups
n =3
# divide a into n groups using cut
grp = as.numeric(cut(cumsum(a), n))
# result
df = data.frame(a=a, grp = grp)
result.df = df %>%
group_by(grp) %>%
mutate(grpsum = sum(a))
result.df
#> # A tibble: 6 x 3
#> # Groups: grp [3]
#> a grp grpsum
#> <dbl> <dbl> <dbl>
#> 1 2 1 6
#> 2 3 1 6
#> 3 1 1 6
#> 4 4 2 4
#> 5 2 3 4
#> 6 2 3 4
<sup>Created on 2019-03-05 by the reprex package (v0.2.1)</sup>
你需要的分组用 grp = as.numeric(cut(cumsum(a), n))
应该够了
不过这个分组跟你的112233稍微不一样,在我测试100个元素时,肉眼看了一下每组的和还是大致均匀。