2016-03-09 2 views
-1

У меня есть несколько столбцов, которые я хотел бы изменить на один столбец с рейтингом и столбцом count. Столбцы имеют неровное количество строк.Как изменить несколько столбцов на один столбец с ранжированием и числом в R?

Example

column 1 | column 2 | column 3 | column 4 | 
    1 | 2  | 3  | 4  | 
    1 | 2  | 3  |   | 
    1 | 2  |   |   | 
    1 |   |   |   | 
    2 | 3  | 4  | 5  | 
    2 | 3  | 4  |   | 
    2 | 3  |   |   | 
    2 |   |   |   | 

Что я пытаюсь сделать, это получить один столбец со всеми уникальными номерами ранг и количество столбцов.

Столбец 1 имеет все уникальные номера из столбцов с 1 по 5. Он организован по ранжированию.

Ранжирование просто посчитать Highers к наименьшим числом - 2 имеет наибольшее число в этом примере 7 и 5 имеет меньше 1. Таким образом, 2 является ранг номер 1.

Count только сколько чисел 2 имеет 7 всего Числа 3 имеют 5 общих чисел.

Column 1 | Ranking | Count | 
    2 | 1 | 7 | 
    3 | 2 | 5 | 
    1 | 3 | 4 | 
    4 | 4 | 3 | 
    5 | 5 | 1 | 

Я пробовал это прямо сейчас. Но у меня есть еще много работы.

df <- read.csv("df.csv", header = TRUE, strip.white =TRUE, stringsAsFactors = FALSE) 
uniquedel <- unique(df) 
write.csv(uniquedel, file = "/Users/uniqueRSA.csv") 

Любая помощь, которую вы можете оказать, была бы очень полезной. Спасибо

+1

Я не могу найти четкое соотношение между исходной таблицей и конечным результатом. Попробуйте лучше объяснить, что вы хотите сделать. Предоставляемый код даже не пытается подойти к проблеме, поэтому было бы лучше, если бы вы попытались дать нам некоторый код, с чего начать. –

+1

'unlist'' df', затем 'table' и применить' rank' – thelatemail

+0

Спасибо за помощь. Я добавил дополнительную информацию, чтобы помочь вам понять, что я пытаюсь сделать. – orthoeng2

ответ

1

Насколько я понимаю, вы просто хотите, чтобы подсчитывать счетчики для каждого целочисленного значения в исходной матрице, независимо от того, в каком столбце она встречается. Затем упорядочьте таблицу по числам этих счетчиков.

# make sample data, like yours 
# note your example contains missing/empty cells 
df <- data.frame(matrix(sample(1:5, 4*8, replace=T),ncol=4,nrow=8)) 

# tabulate and rank, note ranks can be fractional in case of ties 
tab <- table(unlist(df)) 
data.frame(tab,rank(tab))[order(rank(tab), decreasing=TRUE),] 
    Var1 Freq rank.tab. 
1 1 3  1.0 
4 4 5  2.0 
2 2 6  3.0 
3 3 9  4.5 
5 5 9  4.5 

Обратите внимание, что вы, как определить место кажется обратное, как R определяет его: x < y <=> rank(x) < rank(y). Я ответил на буквальную формулировку вашего вопроса.

Вы можете захотеть использовать:

# data.frame(tab,order(tab, decreasing=TRUE))[order(order(tab,decreasing=TRUE)),] 

воспроизвести ваш образец, однако это не обрабатывает связей в хорошем смысле.

Другой вариант заключается в использовании следующих:

data.frame(tab,nrow(tab)-rank(tab))[order(rank(tab),decreasing=TRUE),] 
    Var1 Freq nrow.tab....rank.tab. 
3 3 9     0.5 
5 5 9     0.5 
2 2 6     2.0 
4 4 5     3.0 
1 1 3     4.0 

с помощью нестандартное определение ранга.

+0

Спасибо всем за помощь ..... Можете ли вы, ребята, дать мне несколько советов о том, какие книги читать или смотреть видео? Я пытаюсь поправиться с R – orthoeng2

+0

@ orthoeng2 Проверьте [r tag info страница] (http://stackoverflow.com/tags/r/info); на нем много ресурсов. – alistaire

+0

Извините orthoeng2, единственная книга на R/S, которую я когда-либо читал, это Venables & Ripley, S Programming, Springer – Michael

2

Поскольку, похоже, не имеет значения, где находятся числа, вы можете использовать unlist, чтобы получить все значения в виде одного числового вектора. table будет подсчитывать случаи для вас; вы можете принудить его к data.frame, чтобы дать вам два из трех столбцов, которые вы хотите. Теперь вы можете использовать order, чтобы сделать столбец Ranking, но поскольку это перестановка индексов вместо ранга, вам нужно будет orderorder, чтобы вернуть его в том же порядке, что и ваши ряды. Все сказали, где df оригинальный data.frame:

df2 <- data.frame(table(unlist(df))) 
df2$Ranking <- order(order(df2$Freq, decreasing = T)) 

дает

> df2 
    Var1 Freq Ranking 
1 1 4  3 
2 2 7  1 
3 3 5  2 
4 4 3  4 
5 5 1  5 

Если вы хотите заказать по Ranking, индекс его по order(df2$Freq).Есть много других возможных путей для этого. rank был бы действительно полезен, кроме как в базе он будет только восходящим, а не нисходящим, и, следовательно, также будет иметь некоторые манипуляции.


данные:

df <- structure(list(column.1 = c(1, 1, 1, 1, 2, 2, 2, 2), column.2 = c(2, 
2, 2, NA, 3, 3, 3, NA), column.3 = c(3, 3, NA, NA, 4, 4, NA, 
NA), column.4 = c(4, NA, NA, NA, 5, NA, NA, NA)), .Names = c("column.1", 
"column.2", "column.3", "column.4"), row.names = c(NA, -8L), class = "data.frame") 
+1

'rank (-x)' может использоваться для ранжирования по убыванию. – thelatemail

+0

@thelatemail О, это так просто! Теперь я чувствую себя немой. Честно говоря, я использовал 'dplyr'' desc() 'помощник, но я хотел сохранить эту базу. – alistaire

+0

Плюс, который позволяет вам делать все в одной строке: 'data.frame (table (unlist (df)), Ranking = rank (-table (unlist (df))))' – alistaire