使用dplyr执行一个简单的数据框子集

时间:2018-08-30 11:17:33

标签: r dplyr

请考虑以下数据框切片:

df = data.frame(locations = c("argentina","brazil","argentina","denmark"),
                score = 1:4,
                row.names = c("a091", "b231", "a234", "d154"))
df

     locations score
a091 argentina     1
b231    brazil     2
a234 argentina     3
d154   denmark     4

sorted = c("a234","d154","a091") #in my real task these strings are provided from an exogenous function

df2 = df[sorted,] #quick and simple subset using rownames

编辑:在这里,我正在尝试根据sorted对数据进行子集化和排序-抱歉,以前还不清楚。因此,重要的是输出为:

     locations score
a234 argentina     1
d154   denmark     4
a091 argentina     3

与您从简单的子集操作中获得的结果不同:

     locations score
a091 argentina     1
a234 argentina     3
d154   denmark     4

我想在dplyr中做完全一样的事情。这是一个不雅的骇客:

require(dplyr)    
dt = as_tibble(df)
rownames(dt) = rownames(df)

Warning message:
Setting row names on a tibble is deprecated.

dt2 = dt[sorted,]

我想正确地做到这一点,其中行名是数据表中的索引:

dt_proper = as_tibble(x = df,rownames = "index")
dt_proper2 = dt_proper %>% ?some_function(index, sorted)? #what would this be?

dt_proper2

# A tibble: 3 x 3
  index locations score
  <chr> <fct>     <int>
1 a091  argentina     1
2 d154  denmark       4
3 a234  argentina     3

但是我无法终生想出如何使用filter或其他dplyr函数来执行此操作,而又不进行复杂的因子转换,重新排序因子水平等操作。

3 个答案:

答案 0 :(得分:0)

嗨,

您可以简单地使用mutate和filter来将数据帧的row.names移到索引列中,然后过滤到“ sorted”向量,并根据向量“ sorted”对数据帧进行排序:

df2 <- df %>% mutate(index=row.names(.)) %>% filter(index %in% sorted)
df2 <- df2[order(match(df2[,"index"], sorted))]

答案 1 :(得分:0)

tidyverse中的功能(dplyr,tibble等)是围绕该概念构建的(据我所知),行仅包含属性(列),而没有行名/标签/索引。因此,为了对列进行排序,您必须引入一个新列,其中包含每一行的排名。

我要这样做的方法是创建另一个包含您的“排序信息”(排序属性,等级)的小标题,并将其内部加入到您的原始小标题中。然后我可以按行对行进行排序。

library(tidyverse)

# note that I've changed the third column's name to avoid confusion
df = tibble(
  locations = c("argentina","brazil","argentina","denmark"),
  score = 1:4,
  custom_id = c("a091", "b231", "a234", "d154")
  )

sorted_ids = c("a234","d154","a091")

sorting_info = tibble(
  custom_id = sorted_ids,
  rank = 1:length(sorted_ids)
  )

ordered_ids = df %>%
  inner_join(sorting_info) %>% 
  arrange(rank) %>%
  select(-rank)

答案 2 :(得分:0)

我想我已经解决了:

dt_proper2 = dt_proper[match(sorted,dt_proper$index),]

似乎是df[sorted,]的最短实现。