我想要将多列更改为一个具有排名和计数列的列。列具有不均匀的行数。
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列的所有唯一编号。按排名组织。
排名只是最低计数到最低计数 - 在这个例子中,2是最多的数字7,而5是最少的1.所以2是排名第1。
计数是多少数字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")
无论你能给予什么帮助都会非常有帮助。感谢
答案 0 :(得分:2)
由于数字所在的位置似乎并不重要,因此您可以使用unlist
将所有值作为单个数字向量。然后table
将为您计算事件数;您可以将其强制转换为data.frame
,以便为您提供所需的三列中的两列。您现在可以使用order
制作Ranking
列,但由于它是索引的排列而不是排名,因此您需要order
{{1}以与行相同的顺序将其恢复。总而言之,order
是原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
答案 1 :(得分: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
注意,您定义为 Rank 的内容似乎与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
使用非标准的排名定义。