尽管这应该是一条评论,但由于您说您是 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") & !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”开头的列:
dropcols <- grep("Cofactor", names(df))
# or to ignore case
# grep("Cofactor", names(df), ignore.case = TRUE)
# [1] 3 4 5
如果我只要想删除Cofactor但保留Cofactor1和Cofactor2,我可以使用\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