楼主: pengyu420
2494 9

[问答] 如何以连续三个不等于0的数作为开始统计每行的变量数? [推广有奖]

  • 0关注
  • 0粉丝

高中生

57%

还不是VIP/贵宾

-

威望
0
论坛币
797 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
100 点
帖子
12
精华
0
在线时间
50 小时
注册时间
2014-9-12
最后登录
2021-4-28

楼主
pengyu420 发表于 2019-7-3 18:04:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
求助各位:
我有这样的数据:
0 0 0 3.4 0 2.5 6.2 0 1.4 2.8 0.6 -1 -2.5 1.6 3 2 0 0 0 1.6 0 0 1.2 0 1 0
统计的条件是:
一旦有连续三个数不等于0,就从这三个数中的第一个数开始计数,直到这行最后一个不等于0的数结束。
统计从开始到结束的个数,这行数据就是从1.4到1的个数。
然后按上面条件选出的每行的变量累加求平均值。
类似的数据一个表里有差不多两万行,想统计每行。

我是初学者,多谢各位大神帮助!
二维码

扫码加我 拉你入群

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

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

关键词:最后一个 差不多 初学者 平均值 求平均

回帖推荐

caimiao0714 发表于4楼  查看完整内容

从1.4到1长度应该是17吧? 针对一个vector的话,试试下面的代码,我试了下应该是可以运行的。具体怎么用取决于你的原始数据集的样子,可能需要写个函数进行基于行的运算。

沙发
caimiao0714 学生认证  发表于 2019-7-3 22:56:29
用你的26个数据,你能给出你想要的数据的样子嘛?你的文字解释我读了三遍,还是没读懂你想要什么。

藤椅
pengyu420 发表于 2019-7-4 09:26:13
caimiao0714 发表于 2019-7-3 22:56
用你的26个数据,你能给出你想要的数据的样子嘛?你的文字解释我读了三遍,还是没读懂你想要什么。
抱歉,可能表达的不太清楚。
0 0 0 3.4 0 2.5 6.2 0 1.4 2.8 0.6 -1 -2.5 1.6 3 2 0 0 0 1.6 0 0 1.2 0 1 0
条件就是要连续三个数不等于0才开始计数,一直数到最后一个不等于0的数为止。
这行数据符合条件的就是1.4 2.8 0.6开始往后计数,从1.4数到1,得到的应该是18。
然后这18个数字要求和应该是11.7,再求平均应该是0.65。
其余各行也是按这个条件来算。
最后想要这样形式的
0 0 0 3.4 0 2.5 6.2 0 1.4 2.8 0.6 -1 -2.5 1.6 3 2 0 0 0 1.6 0 0 1.2 0 1 0 18 11.7 0.65
谢谢回复!

板凳
caimiao0714 学生认证  发表于 2019-7-4 12:53:28
pengyu420 发表于 2019-7-4 09:26
抱歉,可能表达的不太清楚。
0 0 0 3.4 0 2.5 6.2 0 1.4 2.8 0.6 -1 -2.5 1.6 3 2 0 0 0 1.6 0 0 1.2 0  ...
从1.4到1长度应该是17吧?
针对一个vector的话,试试下面的代码,我试了下应该是可以运行的。
  1. # orginal vector t
  2. t = c(0, 0, 0, 3.4, 0, 2.5, 6.2, 0, 1.4, 2.8, 0.6, -1, -2.5, 1.6, 3, 2, 0, 0, 0, 1.6, 0, 0, 1.2, 0, 1, 0)

  3. # run length encoding
  4. s = rle(t)
  5. slogic = rle(t != 0)
  6. # index of first 3 non-zero
  7. st = which(slogic$length >= 3 &
  8.              slogic$values)
  9. # index of the last non-zero value
  10. ed = max(which(slogic$values))

  11. # index in the original vector
  12. slogic$values[c(1:(st-1), (ed+1):length(slogic$values))] = NA
  13. ind = inverse.rle(slogic)
  14. ind = ifelse(is.na(ind), FALSE, TRUE)

  15. # desired vector: z
  16. z = t[ind]

  17. > mean(z)
  18. [1] 0.6882353
  19. > length(z)
  20. [1] 17
  21. > sum(z)
  22. [1] 11.7
复制代码
具体怎么用取决于你的原始数据集的样子,可能需要写个函数进行基于行的运算。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 30 + 3 + 3 + 3 热心帮助其他会员
cheetahfly + 10 精彩帖子

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

报纸
Glorevo 发表于 2019-7-4 14:29:07
只要会一点点编程就能解决。
任何一门编程语言,只要学会了最基本的 3 种语句结构:顺序,选择(亦称判断或分支),循环。
此问题迎刃而解!
{:3_52:}
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 10 + 1 + 1 + 1 精彩帖子

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

地板
pengyu420 发表于 2019-7-4 15:37:51
caimiao0714 发表于 2019-7-4 12:53
从1.4到1长度应该是17吧?
针对一个vector的话,试试下面的代码,我试了下应该是可以运行的。具体怎么用取 ...
试过了可以用!多谢!

7
zhangyangsmith 发表于 2019-7-5 18:39:57
# Copied from caimiao0714
t = c(0, 0, 0, 3.4, 0, 2.5, 6.2, 0, 1.4, 2.8, 0.6, -1, -2.5, 1.6, 3, 2, 0, 0, 0, 1.6, 0, 0, 1.2, 0, 1, 0)

# Starting index according to the critria
start <- which.max( ( head(t, -2)*head( t[-1], -1 )*tail(t, -2) ) != 0 )
        
# Last non-zero element
end <- max( which(t != 0) )
        
# All elements selected
slct <- t[start:end]
        
# Results
c( t, length(slct), sum(slct), mean(slct) )

# Do note that here it is assumed there are elements that fulfills the defined criteria


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

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

8
pengyu420 发表于 2019-7-9 11:57:46
zhangyangsmith 发表于 2019-7-5 18:39
# Copied from caimiao0714
t = c(0, 0, 0, 3.4, 0, 2.5, 6.2, 0, 1.4, 2.8, 0.6, -1, -2.5, 1.6, 3, 2, 0 ...
谢谢指导!!非常感谢

9
pengyu420 发表于 2019-7-12 18:18:31
pengyu420 发表于 2019-7-9 11:57
谢谢指导!!非常感谢
你好,我用了我的数据运行以后,提示这个错误:Error in start:end : result would be too long a vector
In addition: Warning message:
In max(which(ax[, i] != 0)) :
  no non-missing arguments to max; returning -Inf

完全不知道什么意思
是否是因为数据量太大?我的数据表有365行107列。
请问这个应该怎么处理?
附上我的代码和数据表,数据原本是csv格式,为了上传方便转成xlsx格式的了。

  1. ax<-read.csv(file="data.csv",header = T)   

  2. a0<-NULL
  3. b0<-NULL
  4. c0<-NULL
  5. d0<-NULL
  6. for (i in 1:(dim(ax)[2])){
  7.   start <- which.max( ( head(ax[,i], -2)*head( ax[,i][-1], -1 )*tail(ax[,i], -2) ) != 0 )
  8.   end <- max( which(ax[,i] != 0) )
  9.   slct <- ax[,i][start:end]
  10.   aa<-length(slct)
  11.   bb<-sum(slct)
  12.   cc<-bb/aa
  13.   dd<-100.223/(1+exp(-cc*0.312)*exp(-aa*0.0534))
  14.   a0<-c(a0,aa)
  15.   b0<-c(b0,bb)
  16.   c0<-c(c0,cc)
  17.   d0<-c(d0,dd)
  18. }
  19. ee<-cbind(a0,b0,c0,d0)
复制代码


10
pengyu420 发表于 2019-7-12 18:54:48
pengyu420 发表于 2019-7-12 18:18
你好,我用了我的数据运行以后,提示这个错误:Error in start:end : result would be too long a vector ...
我似乎找到原因了,当某列都是零的时候就报错,请问是否是这个原因呢?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 09:21