这里有一个数据集,我正试图对其进行子集。
df<-data.frame(
id=c(1:5),
ax1=c(5,3,7,-1,9),
bx1=c(0,1,-1,0,3),
cx1=c(2,1,5,-1,5),
dx1=c(3,7,2,1,8))
该数据集有一个变量x1,在不同的时间点测量,分别用ax1、bx1、cx1和dx1表示。我试图通过删除任何一列上带有-1的行来子集这些数据(即ax1, bx1, cx1, dx1)。我想知道是否有一种方法可以自动过滤(或过滤函数)来执行这个任务。我熟悉的情况是,重点是基于单一列(或变量)来过滤行。
对于目前的情况,我做了一个尝试,从以下方面入手
mutate_at( vars(ends_with("x1"))
来选择所需的列,但我不知道如何将其与过滤器功能结合起来,以产生所需的结果。期待的输出结果会有第三和第四行被删除。我很感激任何关于这方面的帮助。有一个类似的案例解决了 此处 但这并没有通过自动化流程来完成。我想让自动化适应有许多列的大数据的情况。
使用基数R 。
用 rowSums
cols <- grep('x1$', names(df))
df[rowSums(df[cols] == -1) == 0, ]
# id ax1 bx1 cx1 dx1
#1 1 5 0 2 3
#2 2 3 1 1 7
#5 5 9 3 5 8
或与 apply
:
df[!apply(df[cols] == -1, 1, any), ]
您可以使用 filter()
与 across()
.
library(dplyr)
df %>%
filter(across(ends_with("x1"), ~ .x != -1))
# id ax1 bx1 cx1 dx1
# 1 1 5 0 2 3
# 2 2 3 1 1 7
# 3 5 9 3 5 8
这相当于 filter_at()
与 all_vars()
该文件已被以下文件取代 dplyr 1.0.0
.
df %>%
filter_at(vars(ends_with("x1")), all_vars(. != -1))
使用 filter_at
;
library(tidyverse)
df<-data.frame(
id=c(1:5),
ax1=c(5,3,7,-1,9),
bx1=c(0,1,-1,0,3),
cx1=c(2,1,5,-1,5),
dx1=c(3,7,2,1,8))
df
df %>%
filter_at(vars(ax1:dx1), ~. != as.numeric(-1))
# id ax1 bx1 cx1 dx1
# 1 1 5 0 2 3
# 2 2 3 1 1 7
# 3 5 9 3 5 8