我最近开始使用R.我有一个数据集,它由两列和100000行组成,如下所示:
Y TOTA
1 1 403500.000
2 1 188334.000
3 0 812387.000
4 0 163626.000
5 1 49527.000
6 1 48661.000
7 0 36712.000
8 1 31745.000
9 1 23342.000
10 0 46835.000
...... . .........
100000 0 10.982
变量Y只能有两个值:0或1,而变量TOTA可以有不同的值。 功能摘要给出了以下结果:
Y TOTA
Min. :0.0000 Min. : 0
1st Qu.:0.0000 1st Qu.: 939
Median :1.0000 Median : 3918
Mean :0.5113 Mean : 40245
3rd Qu.:1.0000 3rd Qu.: 11028
Max. :1.0000 Max. :18938000
NA's :261
目的:
我想创建一个包含10行和3列的表。每行代表我的数据集的十分位数,最后一行显示NA。现在我想填充我的表格来查看数据集。如果数据集中的第一列 1 ,则将+1添加到创建的表中,其中值与其中一列和“Number Active Companies”列的值范围匹配。如果第一个值 0 ,则在值与表值范围匹配的相应行中的“Number Passive Companies”列中添加+1。 表的每一行代表变量TOTA
的不同范围我所尝试的内容
到目前为止,我所尝试的是创建一个包含我的数据集处理结果的表
Number Active Companies Number Passive Companies Total
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0
6 0 0 0
7 0 0 0
8 0 0 0
9 0 0 0
10 0 0 0
result<-matrix(data = 0, nrow = 10, ncol = 3, byrow = FALSE, dimnames = list(1:10,c("Number Active Companies","Number Passive Companies","Total")));
之后我创建了10个包含不同变量范围的组:
x > 0 && x < 100
x > 100 && x < 1000
x > 1000 && x < 10000
x > 10000 && x < 100000
x > 100000 && x < 1000000
x > 1000000 && x < 1000000
x > 5938000 && x < 10938000
x > 10938000 && x < 15938000
x > 15938000 && x < 18938000
x=NA
现在我想用这种方式填充上一个表格。 我想分析Y变量的每一行,如果它是1,它应该为列号活跃公司加1,而当Y为零时,该数字属于anc的行。
for(i in TOTA){
if (Y=1)
if(x > 0 && x < 100){
}else if(x > 100 && x < 1000){
}else if(x > 1000 && x < 10000){
}else if(x > 10000 && x < 100000){
}else if(x > 100000 && x < 1000000){
}else if( x > 1000000 && x < 1000000){
}else if( x > 1000000 && x < 1000000){
}else if( x > 5938000 && x < 10938000){
}else if( x > 10938000 && x < 15938000){
}else if( x > 15938000 && x < 18938000) {
}else{
//Nas
}
}else if(Y=0){
if(x > 0 && x < 100){
}else if(x > 100 && x < 1000){
}else if(x > 1000 && x < 10000){
}else if(x > 10000 && x < 100000){
}else if(x > 100000 && x < 1000000){
}else if( x > 1000000 && x < 1000000){
}else if( x > 1000000 && x < 1000000){
}else if( x > 5938000 && x < 10938000){
}else if( x > 10938000 && x < 15938000){
}else if( x > 15938000 && x < 18938000) {
}else{
//Nas
}
}
问题
我怎样写在桌子上? 我怎样才能更轻松地完成这个过程? 如何创建此表的直方图?
我想知道我是否正在做正确的事情,因为我已经阅读了函数quantile()和percentile()的手册,看起来他们做了同样的事情
你能否给我一些准则和可能的命令来实现我的目标
谢谢
答案 0 :(得分:1)
仍然很难弄清楚你想要完成什么,但这是我最好的猜测:
# create reproducible example - you already have this...
set.seed(1)
df <- data.frame(Y=sample(0:1,100000,replace=T),
TOTA=runif(100000,0,18938000))
na <- sample(1:100000,5000) # 5% NA
df[na,]$TOTA <- NA
# you start here...
breaks <- c(0,10^(2:6), 5938000, 10938000, 15938000, 18938000)
labels <- c("0-100","100-1000","1000-10000","10000-100000",
"100000-100000","100000-1000000","1000000-5938000",
"5938000-10938000","10938000-18938000","NA")
df$group <- cut(df$TOTA,breaks=breaks,labels=F)
df[is.na(df$group),]$group <- 10
df$grpLabel <- labels[df$group]
result <- aggregate(Y~group,df,function(x)sum(x==1))
colnames(result) <- c("Group","Active")
result$Passive <- aggregate(Y~group,df,function(x)sum(x==0))$Y
result$Group <- labels[result$Group]
result
# Group Active Passive
# 1 0-100 0 1
# 2 100-1000 1 2
# 3 1000-10000 29 17
# 4 10000-100000 224 212
# 5 100000-100000 2310 2288
# 6 100000-1000000 12365 12328
# 7 1000000-5938000 12508 12522
# 8 5938000-10938000 12526 12649
# 9 10938000-18938000 7485 7533
# 10 NA 2544 2456
因此,这会使用cut(...)
将数据集划分为多个组,然后使用1s
分别对0s
和aggregate(...)
求和,然后标记这些组。通常,您可以使用cut(...)
而不使用labels=F
,并直接为您的群组获取有意义的标签。这里的问题是aggregate(...)
将按字母顺序排序,这不是你想要的。
另请注意,在您的问题中,您的范围为1000000 - 1000000(例如1MM至1MM)。我以为这应该是1000000 - 5938000。