楼主: nkwinter
15584 10

[问答] 求问用R语言进行区间的统计 [推广有奖]

  • 0关注
  • 0粉丝

大专生

76%

还不是VIP/贵宾

-

威望
0
论坛币
8 个
通用积分
0.0002
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
551 点
帖子
31
精华
0
在线时间
58 小时
注册时间
2016-3-22
最后登录
2022-3-6

楼主
nkwinter 发表于 2016-5-30 09:27:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
示例数据,共有两列
1        42                        
1        65                        
1        79                        
1        164                        
2        34                        
2        58                        
2        103                        
3        5                        
3        109                        
                                
想得到的结果,就是第一列为1时,第二列和第三列输出统计范围的区间,第四列输出这个范围有多少个数据,第五列是数据占总数据的比列                                
                                
1        0            99          3        0.3333333333 (这个区间的数值占总数的比例,本例共9个数,即3除以9)
1        100        199        1        0.1111111111
2        0            99          2        0.2222222222
2        100        199        1        0.1111111111
3        0            99          1        0.1111111111
3        100        199        1        0.1111111111

实际数据量很大,求用R语言实现
这个苦苦思索了好长时间,无解,恳求高人帮助

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 实际数据 统计

沙发
zl66983279 在职认证  发表于 2016-5-30 11:27:46
“想得到的结果,就是第一列为1时”第一列为1指的是两列的数据中只计算第一列为1的 对应的第二列的情况?
另外最大值已知吗?

藤椅
nkwinter 发表于 2016-5-30 11:37:38
zl66983279 发表于 2016-5-30 11:27
“想得到的结果,就是第一列为1时”第一列为1指的是两列的数据中只计算第一列为1的 对应的第二列的情况?
对,是的,第1列为1时,对其对应第二列数值分布进行统计;第1列为2时,对其对应第二列数值分布进行统计。最大值已知,但是每组都不一样

板凳
zl66983279 在职认证  发表于 2016-5-30 14:50:53
时间不多 你要的基本上写出来了 剩下的你自己调调吧
data<- data.frame(c1=c(1,1,1,2,2,2,3,3,3),c2=c(45,128,259,321,1233,63,121,223,1232)) #设原始数据为data,两列分别为c1,c2
j <- unique(data$c1)   #将c1列去重
for (i in j) {  #按每个c1循环
new_data<- data[data$c1==i,]  
max_num<- max(new_data[,2]) #找到每个c1的最大值
max_range<-(max_num%/%100+1)*100-1  #找到最大的范围值
range<- cut(new_data[,2],seq(-1,max_range,100))  #从-1到最大值范围值区间化
data[data$c1==i,"c3"]<- as.character(range) #将区间值加到源数据中
}
new<- as.data.frame( table(data[,c(1,3)]))  #统计区间值
new<-new[new$Freq>0,]
sum_num<- sum(data$c2)     #求c2列之和
new<- cbind(new,new$Freq/sum_num)
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

报纸
zl66983279 在职认证  发表于 2016-5-30 14:51:59
data<- data.frame(c1=c(1,1,1,2,2,2,3,3,3),c2=c(45,128,259,321,1233,63,121,223,1232)) #设原始数据为data,两列分别为c1,c2
j <- unique(data$c1)   #将c1列去重
for (i in j) {  #按每个c1循环
new_data<- data[data$c1==i,]  
max_num<- max(new_data[,2]) #找到每个c1的最大值
max_range<-(max_num%/%100+1)*100-1  #找到最大的范围值
range<- cut(new_data[,2],seq(-1,max_range,100))  #从-1到最大值范围值区间化
data[data$c1==i,"c3"]<- as.character(range) #将区间值加到源数据中
}
new<- as.data.frame( table(data[,c(1,3)]))  #统计区间值
new<-new[new$Freq>0,]
sum_num<- sum(data$c2)     #求c2列之和
new<- cbind(new,new$Freq/sum_num)

地板
zl66983279 在职认证  发表于 2016-5-30 14:54:05
data<- data.frame(c1=c(1,1,1,2,2,2,3,3,3),c2=c(45,128,259,321,1233,63,121,223,1232)) #设原始数据为data
j <- unique(data$c1)   #将c1列去重
for (i in j) {  #按每个c1循环
new_data<- data[data$c1==i,]  
max_num<- max(new_data[,2]) #找到每个c1的最大值
max_range<-(max_num%/%100+1)*100-1  #找到最大的范围值
range<- cut(new_data[,2],seq(-1,max_range,100))  #从-1到最大值范围值区间化
data[data$c1==i,"c3"]<- as.character(range) #将区间值加到源数据中
}
new<- as.data.frame( table(data[,c(1,3)]))  #统计区间值
new<-new[new$Freq>0,]
sum_num<- sum(data$c2)     #求c2列之和
new<- cbind(new,new$Freq/sum_num)

7
zl66983279 在职认证  发表于 2016-5-30 14:55:44
排版不知道怎么着有问题

1.txt
下载链接: https://bbs.pinggu.org/a-2042190.html

625 Bytes

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
nkwinter + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

8
cheetahfly 在职认证  发表于 2016-5-30 15:04:00
我需要用到dplyr包,另外我用'[['来引用而不是用“美元符号”的原因是因为论坛的排 版。
  1. # 加载dplyr包
  2. library(dplyr)
  3. # 构建分析对象
  4. a <- data.frame(id = c(1,1,1,1,2,2,2,3,3), value = c(42,65,79,164,34,58,103,5,109))
  5. # 将连续数据区间化
  6. a[["interval"]] <- findInterval(a[["value"]], c(0, 100, 300))
  7. # 拷贝到分析用的数据框
  8. result <- a[,-2]
  9. # 按分组计算重复值的个数
  10. result <- tally(group_by(result, id, interval))
  11. # 计算比例
  12. result[["ratio"]] <- result[["n"]] / sum(result[["n"]])
  13. # 构建区间的上下边界
  14. result[["low"]] <- (result[["interval"]] - 1) * 100
  15. result[["high"]] <- result[["interval"]] * 100 - 1
  16. # 重排一下列的顺序
  17. result <- result[, c(1,5,6,3,4)]
  18. # 观察分析结果
  19. result
  20. Source: local data frame [6 x 5]
  21. Groups: id [3]

  22.      id   low  high     n     ratio
  23.   (dbl) (dbl) (dbl) (int)     (dbl)
  24. 1     1     0    99     3 0.3333333
  25. 2     1   100   199     1 0.1111111
  26. 3     2     0    99     2 0.2222222
  27. 4     2   100   199     1 0.1111111
  28. 5     3     0    99     1 0.1111111
  29. 6     3   100   199     1 0.1111111
复制代码

已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
nkwinter + 1 + 1 + 1 观点有启发
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

9
nkwinter 发表于 2016-5-30 18:21:39
谢谢解答,问题已解决

10
千车麦穗 发表于 2020-1-17 22:10:09
cheetahfly 发表于 2016-5-30 15:04
我需要用到dplyr包,另外我用'[['来引用而不是用“美元符号”的原因是因为论坛的排 版。
太及时了,谢谢老师

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 15:39