gpt4 book ai didi

r - 过滤显示反直觉行为的数据框列 (R)

转载 作者:行者123 更新时间:2023-12-05 01:05:17 24 4
gpt4 key购买 nike

以下面的数据框为例。我需要通过仅保留 filter 对象中的列来更改数据框。

test <- data.frame(A = c(1,6,1,2,3) , B = c(1,2,1,1,2), C = c(1,7,6,4,1), D = c(1,1,1,1,1))
filter <- c("A", "B", "C", "D")
filter2 <- c("A","B","D")

为此,我正在使用这段代码:

`%ni%` <- Negate(`%in%`)
test <- test[,-which(names(test) %ni% filter2)]

如果我使用 filter2 对象,我会得到预期的结果:

  A B D
1 1 1 1
2 6 2 1
3 1 1 1
4 2 1 1
5 3 2 1

但是,如果我使用 filter 对象,我会得到一个包含零列的数据框:

data frame with 0 columns and 5 rows

我希望得到一个未触及的数据框,因为 filter 中包含所有测试列。为什么会发生这种情况,在这些情况下如何编写更可靠的代码不会得到空数据帧?

最佳答案

使用 ! 代替 -

test[,!(names(test) %ni% filter2)]
test[,!(names(test) %ni% filter)]

通过which包裹并使用-,只有当which输出的length为大于 0

> which(names(test) %ni% filter2)
[1] 3
> which(names(test) %ni% filter)
integer(0)

通过-integer(0)的情况没有变化

> -which(names(test) %ni% filter)
integer(0)
> -which(names(test) %ni% filter2)
[1] -3

因此,

> test[integer(0)]
data frame with 0 columns and 5 rows

关于r - 过滤显示反直觉行为的数据框列 (R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70725472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com