k******a 发帖数: 816 | 1 比如说我有一串数列:
0 1 0 0 3 5 0 0 0 4
在这个数列里面一共有六个零,不过零的最长连续个数是三。
不知道excel里面能不能实现?我现在只能在excel里找到如何求某数值的总个数。
请各位高手赐教,sas 或者 r的做法也行,万分感谢! | s*****n 发帖数: 2174 | 2 你要找的目标数(你例子里面的0) 是已知的还是未知的?
比如(1, 0, 0, 0, 2, 2, 2, 2) 是要返回(最长连续"0"的)3
还是返回(最长连续"2"的)4.
比如你要是希望找最长的相同数段(2,2,2,2)的话
a <- c(1, 0, 0, 0, 2, 2, 2, 2)
find.consecutive.same <- function(t){
return(order(c(diff(a[t:length(a)]) == 0, F))[1])
}
max(sapply(1:(length(a) - 1), find.consecutive.same))
如果你要找连续的已知固定数, 比如找0的话.
a <- c(1, 0, 0, 0, 2, 2, 2, 2)
find.consecutive.same <- function(t){
return(order(a[t:length(a)] == 0)[1] - 1)
}
max(sapply(1:length(a), find.consecutive.same)) | f***a 发帖数: 329 | 3 正好无聊发呆中,写了个function。
输入你的数据和你想找的那个数,结果返回那个数值的1)最长连续序列的长度;2)这
种序列在数据中的个数;3)每一个这种序列的位置;4)整个数据中“此数”和“非
此数”的详细分布情况
#Function Details
#"Size": indicates the number of elements in the longest segment
#"Number": indicates the number of the longest segment
#"Location" indicaties the location of 1st element in the longest
segment
#"Frequency": shows the frequency details of the data
# ("1"=the number you are checking, "0"=other numbers)
countforyou <- function(dat,num=1)
{
vec <- as.numeric(dat==n | k******a 发帖数: 816 | | b******v 发帖数: 1493 | 5 可以用c或者r编程实现
假设数组存在a[]里
用两个数p,n分别记录当前最长连续子数组的起始位置和长度
然后用q,m分别记录当前连续数组的起始位置及长度
然后每进一个新的数a[i]进来,判断是否与a[q]相同
*如果相同,则m变成m+1
如果这时m比n大,则替换p为i,n为m
*如果不同,则q变成i,m变成1
等把数组扫描完了,p,n中就保存了你要的信息
这样这个算法的复杂度是O(N),其中N是数组长度
【在 k******a 的大作中提到】 : 比如说我有一串数列: : 0 1 0 0 3 5 0 0 0 4 : 在这个数列里面一共有六个零,不过零的最长连续个数是三。 : 不知道excel里面能不能实现?我现在只能在excel里找到如何求某数值的总个数。 : 请各位高手赐教,sas 或者 r的做法也行,万分感谢!
| f***a 发帖数: 329 | 6 你这样只能找到第一个最长序列的长度和位置,后面跟它一样长的序列都被忽略了,而
且如果那个数
不是你想找的数的话给出的结果错的。
譬如数据是: 1,1,1,2,2,2,2,3,3,3,1,1,1
想要找的是最长的连续“1”数列的位置
答案应该是:有2组“1,1,1”,位置分别是 1,11
你的方法给出的是:4 (“2,2,2,2”的位置)
所以应该是在做判断的时候把不是想找的数的情况都要剔除,而且要考虑最长序列有不
止一处的情
况。
【在 b******v 的大作中提到】 : 可以用c或者r编程实现 : 假设数组存在a[]里 : 用两个数p,n分别记录当前最长连续子数组的起始位置和长度 : 然后用q,m分别记录当前连续数组的起始位置及长度 : 然后每进一个新的数a[i]进来,判断是否与a[q]相同 : *如果相同,则m变成m+1 : 如果这时m比n大,则替换p为i,n为m : *如果不同,则q变成i,m变成1 : 等把数组扫描完了,p,n中就保存了你要的信息 : 这样这个算法的复杂度是O(N),其中N是数组长度
| b******v 发帖数: 1493 | 7 C++程序如下
#include
using namespace std;
int main()
{
int a[] = {0, 1, 0, 0, 3, 5, 0, 0, 0, 4};
int p,n,q,m;
p = 0;
n = 1;
q = 0;
m = 1;
int N = sizeof(a)/sizeof(int);
for(int i=1; i
if(a[i]==a[q]) {
m=m+1;
if(m>n) {
p = q;
n = m;
}
}
else {
q = i;
m = 1;
}
}
cout << "starting position is " << p << endl;
cout <<
【在 b******v 的大作中提到】 : 可以用c或者r编程实现 : 假设数组存在a[]里 : 用两个数p,n分别记录当前最长连续子数组的起始位置和长度 : 然后用q,m分别记录当前连续数组的起始位置及长度 : 然后每进一个新的数a[i]进来,判断是否与a[q]相同 : *如果相同,则m变成m+1 : 如果这时m比n大,则替换p为i,n为m : *如果不同,则q变成i,m变成1 : 等把数组扫描完了,p,n中就保存了你要的信息 : 这样这个算法的复杂度是O(N),其中N是数组长度
| b******v 发帖数: 1493 | 8 sorry,好像楼主确实要的是某个数的最长连续序列
【在 b******v 的大作中提到】 : C++程序如下 : #include : using namespace std; : int main() : { : int a[] = {0, 1, 0, 0, 3, 5, 0, 0, 0, 4}; : int p,n,q,m; : p = 0; : n = 1; : q = 0;
| k******a 发帖数: 816 | | k******a 发帖数: 816 | 10 谢谢各位的指导,
澄清一下
我想要的是某个确定数值的最长连续个数,而非所有数值中最长的。 | f***a 发帖数: 329 | 11 C++ code如下。
输出结果对应我上面写的 R code, 不过我没把 detailed frequency显示出来。
#include
int main()
{
using namespace std;
int d[] = {1,1,1,2,2,1,1,2,2,1,1,1,3,3,3,1,1,1,3,2};
int num = 1;
int Ndata= sizeof d / sizeof d[0];
int n[Ndata];
int s[Ndata];
int l[Ndata];
int i=0;
n[i]=d[0]; s[i]=1; l[i]=1;
for (int k=1; k
{
if(n[i]==d[k])
{
s[i]++;
}
else
{
i++; n[i]=d[k]; s[i]=1; l[i]=k+1;
}
}
in
【在 k******a 的大作中提到】 : 你们太猛了! : 请问有没有sas的做法
| f***a 发帖数: 329 | 12 需要的话我可以把matlab code也补上去
我只用 c++, matlab, R, 除非不可抗拒因素一般不用sas 。。。。。 :(
等用sas的进来补全sas code吧,呵呵
【在 k******a 的大作中提到】 : 你们太猛了! : 请问有没有sas的做法
| y****n 发帖数: 46 | 13 data old;
input x @@;
cards;
0 1 0 0 3 5 0 0 0 4
run;
data new;
set old;
by x notsorted;
if first.x then ct1=0;
ct1+1;
run;
proc sql;
create table test as
select x,count(*) as totct, max(ct1) as max_csct
from new
group by x;
quit; |
|