如何将多个列更改为一个列,并在R中具有排名和数字计数?

如何将多个列更改为一个列,并在R中具有排名和数字计数?,r,unique,lapply,R,Unique,Lapply,我有多个列,我想更改为一个列,其中有一个秩和一个计数列。列的行数不均匀 示例 column 1 | column 2 | column 3 | column 4 | 1 | 2 | 3 | 4 | 1 | 2 | 3 | | 1 | 2 | | | 1 | | |

我有多个列,我想更改为一个列,其中有一个秩和一个计数列。列的行数不均匀

示例

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的数字最少。所以2是排名第一

计数就是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")

df据我所知,您只需将原始矩阵中每个整数值的计数制成表格,而不管它出现在哪个列中。然后按这些计数的秩对表进行排序

# 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
然而,这并不能很好地处理领带

另一种选择是使用以下选项:

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

使用秩的非标准定义。

由于数字位于何处似乎无关紧要,因此可以使用
取消列出
仅将所有值作为单个数字向量获取<代码>表格
将为您计算发生次数;您可以将其强制转换为
data.frame
以提供所需的三列中的两列。现在可以使用
order
创建
Ranking
列,但由于它是索引的排列而不是秩,因此需要
order
order
按与行相同的顺序取回。总之,其中
df
是原始
数据。frame

df2 <- data.frame(table(unlist(df)))
df2$Ranking <- order(order(df2$Freq, decreasing = T))
如果您想按
排序
,请按
顺序(df2$Freq)
对其进行索引。还有很多其他可行的方法
rank
将非常有用,除了在base中它只是升序而不是降序,因此也需要一些操作


数据:


df我似乎找不到初始表和最终结果之间的明确关系。请尽量解释清楚你想做什么。提供的代码甚至没有试图解决问题,因此最好您尝试给我们一些代码从何处开始。
unlist
df
,然后
table
it并应用
rank
感谢您的帮助。我添加了一些更多的信息来帮助您理解我要做的事情。
rank(-x)
可以用来降序。@thelatemail哦,这太简单了!我现在觉得自己很笨。老实说,我一直在使用dplyr的
desc()
helper,但我想保持这一切都是基本的。另外,这让您可以在一行中完成:
data.frame(table(unlist(df)),Ranking=rank(-table(unlist(df)),
transform(data.frame(table)(unlist(df)),Ranking=rank(-Freq))
保存两次取消列表/表格。谢谢大家的帮助。。。。。你们能给我一些建议看什么书或者看什么视频。。。我正在努力让自己变得更好R@orthoeng2看看这个网站;很抱歉,我只读过一本关于R/s的书,那就是Venables&Ripley的编程,Springer
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
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")