数据框特定行中的前5个值

时间:2019-01-22 06:47:33

标签: r dataframe

我有一个包含165个列的数据框,其中我有不同的值。 数据框如下所示:

skill1   skill2     slkill3       skill4
1     1     0        54             20
2     0     23       9              2

我想找到特定行的前3个值。该怎么做?

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>