2015-08-06 5 views
0

Я не могу понять это. У меня есть кадр данныхКлассифицировать идентификационную колонку на основе другого столбца

id=c(1,2,3,4,2,6,1,1,6,5,4,2) 
per=c(0.1,0.9,0.6,0.5,0.8,0.9,0.2,0.3,0.7,0.5,0.4,0.3) 
df=data.frame(id=id,per=per) 

Я хочу, чтобы разделить столбец «за» в трех условиях, позволяет сказать, от 0 до 0,3 (мы присваиваем 3), 0,3 и 0,7 (мы присваиваем 2), и 0,7 и 1 (мы назначаем 1).

Моей идеей является присвоение каждому уникальному id наибольшему числу этого деления, т. Е. Если для id = 1 в диапазоне 0.7-1 больше «per», то этот идентификатор соответствует этому делению, id = 1 соответствует «1». Таким образом, пример будет выглядеть следующим образом:

id class 
    1  3 
    2  1 
    3  2 
    4  2 
    5  2 
    6  1 

Я нашел

R- selecting a row based on characteristics of another column in that row

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

Спасибо!

+1

Ваше определение не ясно для края случаях: должно быть 0,3 назначено 3 или 2? Аналогично, 0,7 представляет собой 2 или 1? – Ricky

+0

Вы правы, я прошу прощения. Он должен быть: 1: 0 <= x <0,3, 2: 0,3 <= x <0,7, 3: 0,7 <= x <1 – Andres

+2

Другой вариант - 'c (3, 2, 1) [findInterval (per, c (0, 0.3, 0.7, 1))] ' – akrun

ответ

1

Сначала назначьте классы

cl <- cut(per, breaks = c(0, 0.3, 0.7, 1), labels = c(3, 2, 1), right=FALSE) 

Параметр right=FALSE обрабатывать крайние случаи, как было указано в комментариях.

Затем найти количество классов для каждого идентификатора

chk <- table(id, cl) 

Результат

> chk 
    cl 
id 3 2 1 
    1 2 1 0 
    2 0 1 2 
    3 0 1 0 
    4 0 2 0 
    5 0 1 0 
    6 0 0 2 

Затем найти имя столбца с наибольшим значением в строке. Предполагая, что связи, когда существует такое же количество класса в ид разрешаются путем выбора последней метки (в данном случае, нижний номер один)

output <- apply(chk, 1, function(x) names(rev(which(x==max(x))))[1]) 

Результат

> output 
    1 2 3 4 5 6 
"3" "1" "2" "2" "2" "1" 
+0

Ничего себе, спасибо! Да, это то, что мне нужно :) – Andres

+0

Извините, что беспокою вас снова, но как мне отслеживать идентификаторы? Мои исходные идентификаторы не идут от 1 до n, но они большие числа, а «вывод» имеет только один столбец «класс». Извините, спасибо! – Andres

+0

В выводе, представленном выше, первая строка (то есть 1, 2, 3, 4 и т. Д.) Не являются порядковыми номерами, а фактическими значениями в 'id'. Если вы замените значения «id» (например, «a», «b», «c» и т. Д.), Вы все равно получите правильную метку. Если вы хотите сохранить его в переменной, просто используйте 'names (output)' или что-то вроде 'output.df <- data.frame (id = names (output), class = output)' – Ricky

1

Вы можете легко достигнуть этого с помощью функции cut в R:

# specify cut, and labels 
class <- cut(per, breaks = c(0, 0.3, 0.7, 1), labels = c(3, 2, 1)) 

#cbind with original data frame 
df_new <- cbind(df, class) 

#view 
df_new 

#  id per class 
# 1 1 0.1  3 
# 2 2 0.9  1 
# 3 3 0.6  2 

Надеется, что это помогает!

ОБНОВЛЕНИЕ:

# use dplyr package to summarise 
(df_stats <- df_new %>% group_by(id,class) %>% summarise(count=n())) 

Для данного id, тем выше count, тем выше вероятность, что id принадлежит к тому, что соответствующие class.

+0

Спасибо! Да, это помогает добавить класс, но теперь, и извините, если это очевидно, как я знаю, что id = 1, например, соответствует тому классу (в примере здесь id = 1 является классом 3, поскольку он имеет больше «3», чем «2» или «1»). – Andres

+0

Если я правильно вас понимаю, вы хотите, чтобы 'id' означал, какой класс мажора он содержит? Если я прав, я изменил свой ответ так, чтобы это помогло. –

+0

Я видел ваше редактирование, спасибо большое! – Andres