2013-06-11 47 views
1

我有data.frame,看起来像这样:秩和分数计算

Name1 Name2 Name3 
    1  1   1  
    -1  -1   1 
    1  -1   1 
    1  -1   1  
    -1  -1   1  

我想执行排序秩和检验的每个列,这样即:

从每列的第一个元素开始(因此对于我的data.frame的每个列表) 如果第二个元素等于第一个元素(对于ex:1和1),分数将增加一个因为他们是平等的,否则分数会减少一个单位(因为他们是不平等的,例如:1和-1)。

例如:列 “NAME1”
第一个元素= 1:得分= 1(起始位置)
第二元件= -1:得分= 0(1个单位从先前分(1),因为删除了1个! = -1)
第三个元素= 1:分数= 1(您正在将分数初始化为1.每次初始化时,分数为+1)。
第四个元素= 1:得分= 2(因为第三个和第四个元素相等,所以先前得分1加1个单位)
第五个元素= -1:得分= 1(先前得分2-1单位因为第四个元素!第五元素)。 !

柱 “NAME2”
第一个元素= 1:得分= 1(起始位置)
第二元件= -1:得分= 0(1单位从先前分(1),因为1 =除去 - 1)
第三个元素= -1:分数= 1(您正在重新初始化分数)
第四个元素= -1:分数= 2(第三个元素等于第四个,所以先前的分数将增加1个单位)
第五元件= -1:得分= 3(第四个要素是等于第五之一,所以以前的得分,因此如图2所示,将1个单位增加)

因此计数器将增加或减少一个数== 1的得分,如果在排名的元件是由与前一个相同或不同的,它会在每次它进入时被初始化为1,以0

最终目标是在等级和连续的等级中给予随机分数更高的分数。

谁能帮助我吗?

+0

你想获得的结果是什么?最后一个值?逐步值的顺序?请给出一个关于某些数据结果的例子。 – DrDom

回答

0

考虑一下这个功能:

f <- function(x) 
{ 
    2 * sum(tail(x, -1)==head(x, -1)) - length(x) + 1 
} 

它计算你打算为等于前一个减去不同的元素数量元素的数量比分。由于该最后一个数字与第一个数字是互补的,所以可以用上面的简化形式来写入该函数。

现在,如果你想应用到一个数据帧的所有列,只需使用sapply

dat <- read.table(header=TRUE, text=" 
Name1 Name2 Name3 
    1  1   1  
    -1  -1   1 
    1  -1   1 
    1  -1   1  
    -1  -1   1 
") 
sapply(dat, f) 
# Name1 Name2 Name3 
# -2  2  4 
+1

我了解OP的方式输出应该是'1,-1,5' – eddi

+0

家伙嗨,我的观点是有点不同,你的帮助并不完全适合我的问题。我的想法是在等级和连续的元素中给予较高的分数以便随机的分数。可能我必须编辑我的问题。但无论如何非常感谢你! – Elb

+0

嗨Ferdinand.kraft!即使这个答案完全不符合我的问题,就像迪文的答案一样,这个解决方案突出显示了即使不是最好的方式,也是三列之间的区别。所以再次感谢你! – Elb

2

如果我理解正确的话,你...

d <- read.table(text="Name1 Name2 Name3 
    1  1   1  
    -1  -1   1 
    1  -1   1 
    1  -1   1  
    -1  -1   1", header=TRUE) 


f1 <- function(score, pair) { 
    if (score == 0) pair[1] 
    else if (as.logical(diff(pair))) score - 1 
    else score + 1 
} 

f2 <- function(col) { 
    lagged <- embed(col, 2) 
    Reduce(f1, split(lagged, seq(nrow(lagged))), init=1) 
} 

lapply(d, f2) 
# $Name1 
# [1] 1 
# 
# $Name2 
# [1] -1 
# 
# $Name3 
# [1] 5 
+1

@Elb不符合你的描述,因为当你-1名称2,元素和下一个元素是相同的,所以你要根据自己的OP加1,并得到0 – eddi

+0

是啊,对不起,我是困惑。我删除最后一个注释马修.. – Elb

0

添加一个到一个平等的测试,构建1的的指数和2的从C选择(-1,1)

func <- function(x) 1+     # your "starting position" 
        sum(c(-1, 1)[1+ # convert from 0/1 to 1/2 
            (x[-1] == x[-length(x)]) ]) 

> sapply(dat, func) 
Name1 Name2 Name3 
    -2  2  4 
+1

如果这无法解释的downvote是从OP,以获得更好的答案的办法就是让你的问题更清晰。 –

+0

它来自我,与其他downvote相同的原因,而OP似乎对他们想要的东西感到困惑,这与OP描述不匹配。 – eddi

+1

OP对这个问题的规格是矛盾的(而且非常混乱)。我选择实施第一个。你正在选择第二个。 –

1

这是回答你的问题以后,而不是第一其中之一,我相信马修普卢德已经回答了。

为了得到你想要的排名的度量,你可以为实例数列的有相同数量超过一排一次片的长度的总和。 E.g在下面你的例子中可以添加3和2得到5

x = c(1,-1,1,1,1,-1,-1) 
rle(x) 
#Run Length Encoding 
# lengths: int [1:4] 1 1 3 2 
# values : num [1:4] 1 -1 1 -1 

等级要放在一个函数:

rank = function(x) { 
    x.rle = rle(x) 
    sum(x.rle$lengths[x.rle$lengths > 1]) 
} 

sapply(OP_dat, rank) 
#Name1 Name2 Name3 
# 2  4  5 
+0

嗨eddi!非常感谢您的帮助,并为错误感到抱歉。即使你与我提出的函数完全不符,但我认为这是一个很好的答案,因为在任何情况下,由于元素的原因,在名称2方面相对于名称1(随机分布的元素)的分值更高,而对于名称3的分值更低1在Name2列中。所以这恰好符合我在工作中要强调的内容。万分感谢!!!!! – Elb

0

也许这会有所帮助。

dat <- read.table(header=TRUE, text=" 
Name1 Name2 Name3 
    1  1   1  
    -1  -1   1 
    1  -1   1 
    1  -1   1  
    -1  -1   1 
") 

f <- function(x) { 
    tail(cumsum(x), 1) 
} 

sapply(dat, f) 

#Name1 Name2 Name3 
# 1 -3  5 

如果你要比较这些结果,您可能需要abs值。

+0

这种想法的问题是,像'C(1,1,1,1,-1,-1,-1,-1)'将比分很低 – eddi

+0

是的,你是对的。 – DrDom