为什么 %in% 运算符的行为与具有数据帧索引的 == 运算符的行为不同

问题描述 投票:0回答:1

我正在编写一个函数来清理一些 CEX 数据(并不重要),当我能够执行类似的操作时,我无法弄清楚为什么我无法使用 %in% 将数据框与列表进行子集化对单个项目使用 == 进行操作。我正在尝试执行的操作类似于下面的

f_fails()
。除非我弄错了,否则我需要能够输入字符串,但不能。

下面第 6 项和第 8 项中的 %in% 是否有一些明显不适用于 == 的地方? 我如何以其他方式执行 6 和 8?

# Test Data
set.seed(123)
df <- data.frame(
  NEWID = rep(1:10, 1, each = 10),
  COST = rnorm(100, 1000, 10),
  UCC = round(runif(100, 3995, 4005))
)

# All of these work except the 6th one
# 1.
df[df$UCC == 4000,]
# 2. 
df[df$"UCC" == 4000,]
# 3. 
df[df["UCC"] == 4000,]

# 4. 
df[df$UCC %in% c(4000,4001),]
# 5. 
df[df$"UCC" %in% c(4000,4001),]
# 6.  The one I need does not work
df[df["UCC"] %in% c(4000,4001),]

# 7. This works fine
f_works <- function(data, filter_var, one_val){
  # I can feed values with == and filter
  d <- data[data[filter_var] == one_val,]
  d
}
# 8. This (what I want) returns an empty data frame.
f_fails <- function(data = df, filter_var, many_vals){
  # I cannot feed 2+ values with %in% and filter
  d <- data[data[filter_var] %in% many_vals,]
  d
}

f_works(df, "UCC", 4000)
f_fails(df, "UCC", c(4000,4001))

r dataframe indexing filter operators
1个回答
0
投票

%in%
期望两侧都有一个向量,而
data[filter_var]
返回左侧的数据帧。您需要使用
[[]]
来代替:

f <- function(data = df, filter_var, many_vals){
  d <- data[data[[filter_var]] %in% many_vals,]
}

head(f(df, "UCC", c(4000, 4001)))
#    NEWID     COST  UCC
# 3      1 1015.587 4001
# 4      1 1000.705 4000
# 11     2 1012.241 4000
# 27     3 1008.378 4000
# 28     3 1001.534 4001
# 31     4 1004.265 4001
© www.soinside.com 2019 - 2024. All rights reserved.