【发布时间】:2019-02-05 07:43:36
【问题描述】:
考虑以下数据帧切片:
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 中做同样的事情。这是一个不雅的hack:
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 函数来做到这一点,并且没有一些复杂的因子转换、重新排序因子水平等。
【问题讨论】:
-
检查
tibble::rownames_to_column() -
这似乎允许人们在我上面概述的后两个代码块之间来回转换。是否可以按照我在后一个代码块的结构中描述的那样做? IE。忽略行名 - 我描述的操作可以使用 tibble 中的列来完成吗?
-
如果您想使用
dplyr做同样的事情,为什么要将数据集更改为tibble?保持原样并执行df %>% filter(rownames(.) %in% sorted) -
我不会把它改成 tibble;我在整个数据处理过程中一般都在使用 tibble;我只是想通过与 dataframe 的类似操作来说明我想要的操作。您指定的功能只会过滤;不幸的是,它不会重新排列行。我已更新问题以反映这一点。