我是 R 新手,我想知道 R 中是否有“which”的相反代码?
所以例如当我运行下面的代码时,它会将所有数据保留在 10 到 50 之间,并删除其他所有数据。下面的代码对我有用,没有问题。
data <- data[which(data$age>10 & data$age<50),]
但我想知道是否有代码可以做相反的事情?含义 --> 我想从数据中删除特定行,因此我需要一个指示要删除的内容的代码,而不是指示要保留的内容的代码。如果这有道理吗? 我想按条件删除特定行。
我尝试过使用子集代码,但无法让它工作。 下面的代码是我尝试过但不起作用的代码
data2 <- subset(data1, data1$gender=='male')
所以性别是一列,有女性和男性。我想要一个代码来仅删除男性。
虽然这应该是一条评论,但既然你说你是 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
<- filter(data1, gender!="Male")