Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
data.frame上的秩和分数计算_R - Fatal编程技术网

data.frame上的秩和分数计算

data.frame上的秩和分数计算,r,R,我有一个data.frame,看起来像这样: 我想对每列执行一种秩和测试,以便: 从每列的第一个元素开始(因此对于我的data.frame的每个列表) 如果第二个元素等于第一个元素(对于ex:1和1),分数将增加一个单位,因为它们相等,否则分数将减少一个单位(对于ex:1和-1,因为它们不相等) 例如:列“名称1” 第一要素=1:得分=1(起始位置) 第二个元素=-1:score=0(从上一个分数(1)中删除1个单元,因为1!=-1) 第三个元素=1:score=1(您正在将分数初始化为1。每次

我有一个data.frame,看起来像这样:

我想对每列执行一种秩和测试,以便:

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

例如:列“名称1”
第一要素=1:得分=1(起始位置)
第二个元素=-1:score=0(从上一个分数(1)中删除1个单元,因为1!=-1)
第三个元素=1:score=1(您正在将分数初始化为1。每次初始化时,分数为+1)。
第四元素=1:分数=2(之前的分数1加1个单位,因为第三和第四元素相等)
第五元素=-1:分数=1(之前的分数为2-1单位,因为第四元素!=第五元素)

列“名称2”
第一要素=1:得分=1(起始位置)
第二个元素=-1:score=0(从上一个分数(1)中删除1个单元,因为1!=-1)
第三个元素=-1:score=1(您正在重新初始化分数)
第四个元素=-1:分数=2(第三个元素等于第四个元素,因此前一个分数将增加1个单位)
第五个元素=-1:分数=3(第四个元素等于第五个元素,因此前一个分数so 2将增加1个单位)

因此,如果排名中的元素与前一个元素相等或不同,计数器将增加或减少一个数==1的分数,并且每当它变为0时,计数器将初始化为1

最终的目标是给排名中相等和连续的元素相对于随机元素的分数更高


有人能帮我吗

考虑这个函数:

f <- function(x)
{
  2 * sum(tail(x, -1)==head(x, -1)) - length(x) + 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 

如果我理解正确的话

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

d在相等性测试中添加一个,以构建1和2的索引,从c(-1,1)中选择

func-sapply(dat,func)
名称1名称2名称3
-2     2     4 

这是对你接下来的问题的回答,而不是第一个问题,我相信马修·普劳德已经回答了这个问题

要获得所需排名的度量值,例如,您可以在一行中多次计算具有相同编号的列的长度总和。例如,在下面的例子中,你可以加上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
要将其放入函数中:

f <- function(x)
{
  2 * sum(tail(x, -1)==head(x, -1)) - length(x) + 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 

也许这会有帮助

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 

dat以及您希望获得的结果是什么?一个最终值?逐步值的顺序?请给出一个特定数据的结果示例。我对输出的理解应该是
1,-1,5
嗨,伙计们,我的观点有点不同,您的帮助与我的问题不完全相符。我的想法是给排名中的相等和连续元素相对于随机元素的分数更高。也许我必须修改我的问题。但无论如何,非常感谢你!嗨,费迪南德,卡夫!即使这个答案根本不适合我的问题,就像DWin的答案一样,这个解决方案强调了三列之间的差异,即使不是以最好的方式。所以再次非常感谢你!!!如果这一无法解释的否决票来自OP,那么获得更好答案的方法就是让你的问题更清楚。这是我提出的,与另一个否决票的原因相同,虽然OP似乎对他们想要什么感到困惑,但这与OP描述不符。OP对这个问题有相互矛盾(而且非常混乱)的规范。我选择实现第一个。你正在选择第二个。嗨,德温!即使这个答案根本不符合我的问题,这个解决方案强调了三列之间的差异,即使不是以最佳方式。所以非常感谢你@Elb这与您的描述不匹配,因为当您在Name2中获得-1时,元素和下一个元素是相同的,因此您将根据OPHi eddi添加1并获得0!非常感谢您的帮助,并对错误表示歉意。即使您没有将我的观点与您提出的函数完全匹配,我认为这是一个很好的答案,因为在任何情况下,由于Name2列中的元素1,Name2相对于Name1(随机分布的元素)的得分较高,而相对于Name3的得分较低。这正是我在工作中想要强调的。非常感谢!!!!!这个想法的问题是像
c(1,1,1,1,-1,-1,-1)
这样的东西得分很低
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