【问题标题】:How to remove rows by condition in R?如何在 R 中按条件删除行?
【发布时间】:2023-01-18 22:11:41
【问题描述】:

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

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

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

但是我想知道是否有代码可以做相反的事情?意思 --> 我想从数据中删除特定的行,所以我不需要一个代码来说明要保留什么,而是需要一个代码来指示要删除什么。如果这有意义? 我想按条件删除特定行。

我试过子集代码,但我无法让它工作。 下面的代码是我试过但没有用的代码

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

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

【问题讨论】:

  • 使用-,例如data[-which(data$age&gt;10 &amp; data$age&lt;50),]
  • 成功了!! :D 非常感谢。我做了这个 data2 <- data1[-which(data1$gender=='male'),]

标签: r subset


【解决方案1】:

尽管这应该是一条评论,但由于您说您是 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%,而不是==,这是因为vector recycling——看看当我使用==时会发生什么(提示,它会产生不需要的结果):

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") &amp; !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)]

在我的工作中,最好按名称删除,因为列会稍微移动 - 所以有了名称,我就知道我要删除的内容。我使用的一种解决方法是使用 grepnames(df) 来标识我想要删除的列的位置。

这有点棘手,所以要小心。如果我想放弃全部名称中以“Cofactor”开头的列:

dropcols <- grep("Cofactor", names(df))

# or to ignore case
# grep("Cofactor", names(df), ignore.case = TRUE)
# [1] 3 4 5

如果我只要想删除Cofactor但保留Cofactor1Cofactor2,我可以使用\b在上面放一个word boundary

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

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 2019-08-28
    • 2021-11-25
    • 2023-02-15
    • 2022-01-20
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多