自动过滤,基于多列的数据子集。

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

这里有一个数据集,我正试图对其进行子集。

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 dataframe dplyr subset
1个回答
2
投票

使用基数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), ]

4
投票

您可以使用 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))

0
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.