请考虑以下数据框切片:
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函数来执行此操作,而又不进行复杂的因子转换,重新排序因子水平等操作。
答案 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,]
的最短实现。