如何在R中按条件删除行?

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

我是 R 新手,我想知道 R 中是否有“which”的相反代码?

所以例如当我运行下面的代码时,它会将所有数据保留在 10 到 50 之间,并删除其他所有数据。下面的代码对我有用,没有问题。

data <- data[which(data$age>10 & data$age<50),]

但我想知道是否有代码可以做相反的事情?含义 --> 我想从数据中删除特定行,因此我需要一个指示要删除的内容的代码,而不是指示要保留的内容的代码。如果这有道理吗? 我想按条件删除特定行。

我尝试过使用子集代码,但无法让它工作。 下面的代码是我尝试过但不起作用的代码

data2 <- subset(data1, data1$gender=='male')

所以性别是一列,有女性和男性。我想要一个代码来仅删除男性。

r subset
2个回答
6
投票

虽然这应该是一条评论,但既然你说你是 R 新手,让我花更多的空间以非技术方式解释这一点,因为很明显存在一些混乱。

首先,当您在 R 中使用括号(即

df[x,y]
)进行索引时,
x
部分(逗号之前)查看行,而
y
部分查看列。您的问题标题询问有关删除列的问题,但您的问题询问有关删除行的问题。所以我会经历这两件事。

假设您有这些数据(注意有些数据缺少 (

NA
) 值):

set.seed(123)
n <- 10
df <- data.frame(Age = sample(c(1:100, NA), n, replace = TRUE),
                 Gender = sample(c("Male", "Female", NA), n, replace = TRUE),
                 Cofactor = rep(LETTERS, length.out = n),
                 Cofactor2 = sample(c("Yes", "No", "Maybe", NA), n, replace = TRUE),
                 Cofactor3 = runif(n))

#    Age Gender Cofactor Cofactor2  Cofactor3
# 1   31 Female        A       Yes 0.02461368
# 2   79   Male        B     Maybe 0.47779597
# 3   51 Female        C      <NA> 0.75845954
# 4   14   <NA>        D        No 0.21640794
# 5   67   Male        E     Maybe 0.31818101
# 6   42   <NA>        F        No 0.23162579
# 7   50   <NA>        G       Yes 0.14280002
# 8   43   Male        H        No 0.41454634
# 9   NA   Male        I     Maybe 0.41372433
# 10  14   Male        J      <NA> 0.36884545

掉落

您可以使用数字按行位置对行进行索引 - 即,如果您想保留或删除前三行:

# keep 
df[1:3, ]

# drop
df[-c(1:3),]

注意命令位于

x
索引位置(逗号左侧)。如果您想删除男性的观察结果(行),您可以通过多种方式做到这一点。例如:

df[!(df$Gender %in% "Male"),]

# or using `which()`
df[-(which(df$Gender %in% "Male")),]

#   Age Gender Cofactor1  Cofactor2
# 1  31 Female       Yes 0.02461368
# 3  51 Female      <NA> 0.75845954
# 4  14   <NA>        No 0.21640794
# 6  42   <NA>        No 0.23162579
# 7  50   <NA>       Yes 0.14280002

!
的意思是“不是” - 因此,“选择不是男性的行” - 包括
NA
值。

如果您这样做:

df[df$Gender %in% "Female",]

# or 
df[which(df$Gender %in% "Female"),]

#   Age Gender Cofactor1  Cofactor2
# 1  31 Female       Yes 0.02461368
# 3  51 Female      <NA> 0.75845954

这将显示为“包括所有性别为女性的地方” - 注意

NA
!= 女性,因此不包括在内。

同样,如果您想在

Cofactor1
中同时包含“是”和“也许”:

df[df$Cofactor1 %in% c("Yes", "Maybe"),]

#   Age Gender Cofactor1  Cofactor2
# 1  31 Female       Yes 0.02461368
# 2  79   Male     Maybe 0.47779597
# 5  67   Male     Maybe 0.31818101
# 7  50   <NA>       Yes 0.14280002
# 9  NA   Male     Maybe 0.41372433

请注意,我使用的是

%in%
,而不是
==
,这是因为 向量回收 - 看看我使用
==
时会发生什么(提示,它会产生不需要的结果):

df[df$Cofactor1 == c("Yes", "Maybe"),]

#     Age Gender Cofactor1  Cofactor2
#1     31 Female       Yes 0.02461368
#2     79   Male     Maybe 0.47779597
#NA    NA   <NA>      <NA>         NA
#7     50   <NA>       Yes 0.14280002
#NA.1  NA   <NA>      <NA>         NA

使用

==
的正确方法要冗长得多(
df[(df$Cofactor1 == "Yes"| df$Cofactor1 == "Maybe") & !is.na(df$Cofactor1),]
,因此使用
%in%
是一个不错的选择。

保留/删除

索引列位于索引的

y
位置(逗号右侧)。如果您的数据有大量不需要的列,您可以简单地通过按名称(或列号)建立索引来选择要保留的列:

df[,c("Age", "Gender")]

# or df[, 1:2]

#    Age Gender
# 1   31 Female
# 2   79   Male
# 3   51 Female
# 4   14   <NA>
# 5   67   Male
# 6   42   <NA>
# 7   50   <NA>
# 8   43   Male
# 9   NA   Male
# 10  14   Male

但是你只能按数字删除列(我知道,很奇怪) - 所以你不能删除df[,-c("Age", "Gender")]

但你可以删除
df[,-c(1:2)]

在我的工作中,最好按名称删除,因为列会稍微移动 - 所以通过名称,我确切地知道我要删除的内容。我使用的一种解决方法是使用

grep

names(df)
 来确定我想要删除的列的位置。

这有点棘手,所以要小心。如果我想删除名称中以“Cofactor”开头的

all列:

dropcols <- grep("Cofactor", names(df)) # or to ignore case # grep("Cofactor", names(df), ignore.case = TRUE) # [1] 3 4 5
如果我

想删除Cofactor

但保留
Cofactor1
Cofactor2
,我可以使用
\\b
在其上放置
单词边界

dropcols <- grep("\\bCofactor\\b", names(df)) [1] 3
因此,要删除列,您可以简单地像这样建立索引:

dropcols <- grep("Cofactor", names(df)) df[, -dropcols] # Age Gender # 1 31 Female # 2 79 Male # 3 51 Female # 4 14 <NA> # 5 67 Male # 6 42 <NA> # 7 50 <NA> # 8 43 Male # 9 NA Male # 10 14 Male
    

0
投票
您可以使用库 dplyr 中的函数过滤器: 数据2

<- filter(data1, gender!="Male")

© www.soinside.com 2019 - 2024. All rights reserved.