gpt4 book ai didi

r - 根据特定值过滤 data.frame 的每一列

转载 作者:行者123 更新时间:2023-12-03 22:16:34 24 4
gpt4 key购买 nike

考虑以下数据框:

df <- data.frame(replicate(5,sample(1:10,10,rep=TRUE)))

# X1 X2 X3 X4 X5
#1 7 9 8 4 10
#2 2 4 9 4 9
#3 2 7 8 8 6
#4 8 9 6 6 4
#5 5 2 1 4 6
#6 8 2 2 1 7
#7 3 8 6 1 6
#8 3 8 5 9 8
#9 6 2 3 10 7
#10 2 7 4 2 9

使用 dplyr ,如何在每列(不隐式命名它们)上过滤所有大于 2 的值。

模仿假设的东西 filter_each(funs(. >= 2))
现在我正在做:
df %>% filter(X1 >= 2, X2 >= 2, X3 >= 2, X4 >= 2, X5 >= 2)

这相当于:
df %>% filter(!rowSums(. < 2))

注意:假设我只想过滤前 4 列,我会这样做:
df %>% filter(X1 >= 2, X2 >= 2, X3 >= 2, X4 >= 2) 

或者
df %>% filter(!rowSums(.[-5] < 2))

会有更有效的替代方案吗?

编辑:子问题

如何指定列名并模拟假设 filter_each(funs(. >= 2), -X5) ?

基准子题

由于我必须在大型数据集上运行它,因此我对建议进行了基准测试。
df <- data.frame(replicate(5,sample(1:10,10e6,rep=TRUE)))

mbm <- microbenchmark(
Marat = df %>% filter(!rowSums(.[,!colnames(.) %in% "X5", drop = FALSE] < 2)),
Richard = filter_(df, .dots = lapply(names(df)[names(df) != "X5"], function(x, y) { call(">=", as.name(x), y) }, 2)),
Docendo = df %>% slice(which(!rowSums(select(., -matches("X5")) < 2L))),
times = 50
)

结果如下:
#Unit: milliseconds
# expr min lq mean median uq max neval
# Marat 1209.1235 1320.3233 1358.7994 1362.0590 1390.342 1448.458 50
# Richard 1151.7691 1196.3060 1222.9900 1216.3936 1256.191 1266.669 50
# Docendo 874.0247 933.1399 983.5435 985.3697 1026.901 1053.407 50

enter image description here

最佳答案

这是一个使选择名称变得相当简单的想法。您可以设置要发送到 .dots 的调用列表。 filter_() 的论据.首先是一个创建未评估调用的函数。

Call <- function(x, value, fun = ">=") call(fun, as.name(x), value)

现在我们使用 filter_() ,将调用列表传递到 .dots使用 lapply() 的参数,选择您想要的任何名称和值。
nm <- names(df) != "X5"
filter_(df, .dots = lapply(names(df)[nm], Call, 2L))
# X1 X2 X3 X4 X5
# 1 6 5 7 3 1
# 2 8 10 3 6 5
# 3 5 7 10 2 5
# 4 3 4 2 9 9
# 5 8 3 5 6 2
# 6 9 3 4 10 9
# 7 2 9 7 9 8

您可以查看由 Call() 创建的未评估调用。 ,例如 X4X5 , 和
lapply(names(df)[4:5], Call, 2L)
# [[1]]
# X4 >= 2L
#
# [[2]]
# X5 >= 2L

所以如果你调整 names()X lapply() 的论据,你应该没问题。

关于r - 根据特定值过滤 data.frame 的每一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28183653/

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