繁体   English   中英

R从数据帧生成尊重空白的bin

[英]R generate bins from a data frame respecting blanks

我需要根据一列的值从data.frame生成bin。 我已经尝试过“切割”功能。

例如:我想在数据框中的“ AirTDay”列中创建气温值箱:

AirTDay (oC)    
8.16           
10.88          
5.28

19.82
23.62
13.14


28.84
32.21
17.44
31.21

我需要bin间隔包括从该初始值(即8-9.99、10-11.99、12-13.99 ...)起2摄氏度范围内的所有值,并用该范围的平均值进行标记(即9.5、10.5、12.5 ...),并尊重空白单元格,在bins列中返回“ NA”。

输出应如下所示:

Air_T (oC)    TBins 
8.16          8.5 
10.88         10.5 
5.28          NA 
              NA
19.82         20.5
23.62         24.5
13.14         14.5
              NA
              NA
28.84         28.5
32.21         32.5
17.44         18.5
31.21         32.5

我已经达到:

setwd('C:/Users/xxx') 

temp_data <- read.csv("temperature.csv", sep = ",", header = TRUE)
TAir <- temp_data$AirTDay

Tmin <- round(min(TAir, na.rm = FALSE), digits = 0) # is start at minimum value
Tmax <- round(max(TAir, na.rm = FALSE), digits = 0)  
int <- 2 # bin ranges 2 degrees
mean_int <- int/2

int_range <- seq(Tmin, Tmax + int, int) # generate bin sequence 
bin_label <- seq(Tmin + mean_int, Tmax + mean_int, int) # generate labels

temp_data$TBins <- cut(TAir, breaks = int_range, ordered_result = FALSE, labels = bin_label)

输出表看起来正确,但是由于某种原因,它显示了一个顺序的附加列,移动了列名称,并折叠了所有值,从而消除了空白单元格。 像这样:

Air_T (oC)    TBins 
    1         8.16          8.5 
    2         10.88         10.5 
    3         5.28          NA 
    4         19.82         20.5
    5         23.62         24.5
    6         13.14         14.5
    7         28.84         28.5
    8         32.21         32.5
    9         17.44         18.5
   10         31.21         32.5

关于我在哪里失败以及如何解决的任何想法?

v<-ceiling(max(dat$V1,na.rm=T))
breaks<-seq(8,v,2)
labels=seq(8.5,length.out=length(s)-1,by=2)
transform(dat,Tbins=cut(V1,breaks,labels))
      V1 Tbins
1   8.16   8.5
2  10.88  10.5
3   5.28  <NA>
4     NA  <NA>
5  19.82  18.5
6  23.62  22.5
7  13.14  12.5
8     NA  <NA>
9     NA  <NA>
10 28.84  28.5
11 32.21  <NA>
12 17.44  16.5
13 31.21  30.5

这个结果遵循给定的逻辑:

paste(seq(8,v,2),seq(9.99,v,by=2),sep="-")
 [1] "8-9.99"   "10-11.99" "12-13.99" "14-15.99" "16-17.99" "18-19.99" "20-21.99"
 [8] "22-23.99" "24-25.99" "26-27.99" "28-29.99" "30-31.99"

从中我们可以看出19.82将介于1820之间,因此给定值为18.5 ,类似于10.88位于10-11.99之间,因此被赋予值10.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM