如何使用R中的排名和数量将多列更改为一列?

时间:2016-03-09 00:03:39

标签: r unique lapply

我想要将多列更改为一个具有排名和计数列的列。列具有不均匀的行数。

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")

无论你能给予什么帮助都会非常有帮助。感谢

2 个答案:

答案 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

使用非标准的排名定义。