我有一个包含165个列的数据框,其中我有不同的值。 数据框如下所示:
skill1 skill2 slkill3 skill4
1 1 0 54 20
2 0 23 9 2
我想找到特定行的前3个值。该怎么做?
答案 0 :(得分:2)
这是基本的R选项
lapply(as.data.frame(t(df)), function(x) sort(x, decreasing = T)[1:3])
#$`1`
#[1] 54 20 1
#
#$`2`
#[1] 23 9 2
返回对象是list
,每行的前3个数字都是
或使用apply
apply(df, 1, function(x) sort(x, decreasing = T)[1:3])
# 1 2
#[1,] 54 23
#[2,] 20 9
#[3,] 1 2
此处每列给出前3个数字; df
第1行的第1列,依此类推。
df <- read.table(text = " skill1 skill2 slkill3 skill4
1 1 0 54 20
2 0 23 9 2
", header = T)
答案 1 :(得分:0)
这可能不是最优雅的,但可能会有所帮助:
tidyr::gather(sort(iris[9,],decreasing = T)[,2:3])#returns top two in row 9
使用以上答案中的数据:
tidyr::gather(sort(df[2,],decreasing = T)[,1:3])
df <- read.table(text = " skill1 skill2 slkill3 skill4
1 1 0 54 20
2 0 23 9 2
", header = T)
key value
1 skill2 23
2 slkill3 9
3 skill4 2
答案 2 :(得分:0)
使用tidyverse
,您可以执行以下操作:
df %>%
filter(row_number() == 1) %>%
gather(var, val) %>%
arrange(desc(val)) %>%
top_n(3)
var val
1 slkill3 54
2 skill4 20
3 skill1 1
使用row_number()
中的filter()
,您可以指定行号,然后将数据从宽转换为长,然后根据值进行排列,并选择前三个最大值。
或者:
df %>%
filter(row_number() == 1) %>%
gather(var, val) %>%
mutate(rank = dense_rank(desc(val))) %>%
filter(rank %in% c(1:3)) %>%
select(-rank)
使用row_number()
中的filter()
,您可以指定行号,然后将数据从宽转换为长,创建一个排名变量,然后过滤掉不在前三个最大值中的个案。 / p>