获取删除行的索引
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)
}
我必须删除数据框中的一行并获取已删除行的索引。
实际上,我在闪亮的应用程序中单击了 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)
}