2013-06-11 3 views
1

У меня есть data.frame, который выглядит следующим образом:Оценка расчета баллов сумма на 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), оценка будет увеличена на потому что они равны, иначе оценка будет уменьшена на единицу (becau se они неравны, для ex: 1 и -1).

Пример: Колонка "Имя1"
первого элемент = 1: 1 балл = (начальная позиция)
второго элемента = -1: оценка = 0 (1 единица удаляется из предыдущей оценки (1), потому что 1! = -1)
third element = 1: score = 1 (вы инициализируете счет до 1. При каждом инициализации счет равен +1).
четвертый элемент = 1: оценка = 2 (предыдущий результат 1 плюс 1 единица, потому что третий и четвертый элементы равны)
пятый элемент = -1: оценка = 1 (предыдущий результат 2 - 1 единица, потому что четвертый элемент! = пятый элемент).

колонны "Имя2"
первого элемент = 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 
} 

Он вычисляет оценку Вы предлагаете, как количество элементов, равных предыдущим минус число элементов, которые отличаются. Так как это последнее число дополняет первое, функция может быть записана в упрощенной форме выше.

Теперь, если вы хотите применить, что все столбцы dataframe, просто используйте 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

Hi Ferdinand.kraft! Даже если этот ответ не соответствует моей проблеме вообще, как ответ DWin, это решение подчеркивает, даже если не лучшим образом, разницу между тремя столбцами. Так что спасибо вам снова! – 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 в Name2, элемент и следующий элемент совпадают, поэтому вы должны добавить 1 и получить 0 в соответствии с вашим OP – eddi

+0

Да, извините, я был смущенный. Я удаляю последний комментарий к Мэтью .. – Elb

0

Добавьте один к испытанию равенства построить индекс 1-х и 2-х, чтобы выбрать из с (-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

Если этот необъяснимый нисходящий поток от OP, способ получить более качественные ответы - сделать ваш вопрос более ясным. –

+0

Это от меня, по той же причине, что и у другого downvote, в то время как OP, похоже, путают то, что они хотят, это не соответствует описанию OP. – eddi

+1

ОП имеет противоречивые (и очень запутывающие) спецификации для проблемы. Я решил реализовать первый. Вы выбираете второй. –

1

Это ответ на ваш следующий вопрос, а не первый один, на что я верю, что Матвей Плурд ответил.

Чтобы получить оценку нужного ранга, вы можете, например, подсчитать сумму длин частей ваших столбцов, имеющих одно и то же число более одного раза подряд. Например в примере ниже, вы можете добавить 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

Hi eddi! Большое вам спасибо за вашу помощь и извините за ошибку. Даже если вы точно не согласны с вашей предлагаемой функцией, я думаю, что это хороший ответ, потому что в любом случае оценка выше в Name2 в отношении Name1 (случайно распределенные элементы) и ниже до Name3, как ожидалось из-за элемента 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

Смежные вопросы