获取删除行的索引

get the index of deleted row

我必须删除数据框中的一行并获取已删除行的索引。

实际上,我在闪亮的应用程序中单击了 table 的一行,然后使用操作按钮将其删除:

从这一行我需要索引:

下面是一个演示我想做什么的例子:

library(dplyr)

df1 <- diamonds %>% 
  select(1:2) %>% 
  slice(1:5)

  carat cut    
  <dbl> <ord>  
1  0.23 Ideal  
2  0.21 Premium
3  0.23 Good   
4  0.29 Premium
5  0.31 Good

我从 df1 中删除 row 3 并得到 df2。但是我需要删除行的索引作为向量。

df2 <- df1 %>% 
  slice(-3)

  carat cut    
  <dbl> <ord>  
1  0.23 Ideal  
2  0.21 Premium
3  0.29 Premium
4  0.31 Good 

我试过:

anti_join(df1, df2) %>% 
  rownames_to_column("id") %>% 
  pull(id)

给出:

[1] "1"

预期输出

[1] "3"

我们可以在 'df1'

中创建一个序列列
df1 <- diamonds %>% 
       select(1:2) %>% 
       slice(1:5) %>%
       mutate(rn = row_number())
df2 <- df1 %>% 
  slice(-3)

然后 pull rn

anti_join(df1, df2) %>% 
    pull('rn')
#[1] 3

rownames_to_column 没有给出正确的行号,因为 tibble 不允许行名并且它重置了每个子集的行号,因此我们只得到更改的行号原来的那个。除了 tibble 的情况,这里的 slice 确实重置了,即如果我们检查其中涉及的功能,则会调用 dplyr_new_data_frame,这可能会重置行号

> methods("slice")
#[1] slice.data.frame* slice.index    
> getAnywhere("slice.data.frame")
function (.data, ..., .preserve = FALSE) 
{
    loc <- slice_rows(.data, ...)
    dplyr_row_slice(.data, loc, preserve = .preserve)
}
> dplyr:: dplyr_row_slice
function (data, i, ...) 
{
    if (!is.numeric(i) && !is.logical(i)) {
        abort("`i` must be an numeric or logical vector.")
    }
    UseMethod("dplyr_row_slice")
}
> methods("dplyr_row_slice")
[1] dplyr_row_slice.data.frame* dplyr_row_slice.grouped_df* dplyr_row_slice.rowwise_df*

> getAnywhere("dplyr_row_slice.data.frame")
function (data, i, ...) 
{
    dplyr_reconstruct(vec_slice(data, i), data)
}
> dplyr_reconstruct
function (data, template) 
{
    data <- dplyr_new_data_frame(data)
    return(dplyr_reconstruct_dispatch(data, template))
    UseMethod("dplyr_reconstruct", template)
}
> dplyr:::dplyr_new_data_frame
function (x = data.frame(), n = NULL, ..., row.names = NULL, 
    class = NULL) 
{
    row.names <- row.names %||% .row_names_info(x, type = 0L)
    new_data_frame(x, n = n, ..., row.names = row.names, class = class)
}