如果列包含特定值,如何删除行?
How can I delete rows if a column contains a certain value?
我有一个包含 classification
列的数据框,其中包含四个值:D1
、D2
、D8
和 RD
。
我想删除分类为 D1
或 RD
的所有记录(行)。
我试过这个:
df[(df$classification == "D1" | df$classification == "RD"), ] <- NULL
并且:
df[df$classification == "D1" | df$classification == "RD", ] <- NULL
但是收到这个错误:
Error in x[[jj]][iseq] <- vjj : replacement has length zero
我进行了一些搜索,但我似乎遇到的唯一一件事与尝试访问位置 0 处的第一个元素有关,这显然行不通,因为 R 是 1 索引的。
我哪里错了?
示例数据框:
structure(list(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L,
24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L,
37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L,
50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L,
63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L,
76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L,
89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L,
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L,
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L,
28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L,
41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L,
54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L,
67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L,
80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L,
93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L, 1L, 2L, 3L, 4L, 5L,
6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L,
19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L,
32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L,
45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L,
58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L,
71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L,
84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L,
97L, 98L, 99L, 100L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L,
24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L,
37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L,
50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L,
63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L,
76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L,
89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L),
classification = c("D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD")), class = "data.frame", row.names = c(NA,
-400L))
最好考虑“我如何以我想要的形式创建一个对象”,而不是“我如何就地操作这个对象”。
所以你可以使用下面的语法:
df <- df[!df$classification == "D1" | df$classification == "RD", ]
或者,稍微容易维护的:
df <- df[!df$classification %in% c("D1", "RD"), ]
我想你可以试试这个:
df <- df[!(df$classification == "D1" | df$classification == "RD"), ]
或者 tidyverse
方法是:
library(dplyr)
df %>%
filter(if_any(classification, ~ !(.x %in% c("D1", "RD"))))
或者再次使用基础 R 解决方案:
with(df, subset(df, !(classification == "RD" | classification == "D1"))) -> df
使用 grep()
.
dat[-grep('D1|RD', dat$classification), ]
我有一个包含 classification
列的数据框,其中包含四个值:D1
、D2
、D8
和 RD
。
我想删除分类为 D1
或 RD
的所有记录(行)。
我试过这个:
df[(df$classification == "D1" | df$classification == "RD"), ] <- NULL
并且:
df[df$classification == "D1" | df$classification == "RD", ] <- NULL
但是收到这个错误:
Error in x[[jj]][iseq] <- vjj : replacement has length zero
我进行了一些搜索,但我似乎遇到的唯一一件事与尝试访问位置 0 处的第一个元素有关,这显然行不通,因为 R 是 1 索引的。
我哪里错了?
示例数据框:
structure(list(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L,
24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L,
37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L,
50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L,
63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L,
76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L,
89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L,
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L,
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L,
28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L,
41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L,
54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L,
67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L,
80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L,
93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L, 1L, 2L, 3L, 4L, 5L,
6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L,
19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L,
32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L,
45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L,
58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L,
71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L,
84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L,
97L, 98L, 99L, 100L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L,
24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L,
37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L,
50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L,
63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L,
76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L,
89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L, 100L),
classification = c("D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8",
"RD", "D1", "D2", "D8", "RD", "D1", "D2", "D8", "RD", "D1",
"D2", "D8", "RD")), class = "data.frame", row.names = c(NA,
-400L))
最好考虑“我如何以我想要的形式创建一个对象”,而不是“我如何就地操作这个对象”。 所以你可以使用下面的语法:
df <- df[!df$classification == "D1" | df$classification == "RD", ]
或者,稍微容易维护的:
df <- df[!df$classification %in% c("D1", "RD"), ]
我想你可以试试这个:
df <- df[!(df$classification == "D1" | df$classification == "RD"), ]
或者 tidyverse
方法是:
library(dplyr)
df %>%
filter(if_any(classification, ~ !(.x %in% c("D1", "RD"))))
或者再次使用基础 R 解决方案:
with(df, subset(df, !(classification == "RD" | classification == "D1"))) -> df
使用 grep()
.
dat[-grep('D1|RD', dat$classification), ]