0

我真的很难从 R 中的数据集中删除一组行。

我有一个数据框如下:

ID    col1   sp  
R1    1.2    F  
R2    2.35   F   
R3    5      NA  
R4    4.3    NA    
R5    2.22   T  
R6    1.35   F

我想删除 row R5,基于它T在 sp 列中有 a 的事实。但我不希望它删除带有NA(即 R3 和 R4 行)的行,因为我仍然需要其中的数据col1

我使用的代码:

data1<-subset(data,sp!="T")

但这也会删除列中NA的所有行spIDs R3、R4 和 R5)。我也试过:

data1<-subset(data,sp!="T",na.rm=FALSE)

但这仍然删除了所有三行 - 我只想删除“sp”列中带有“T”的那一行。我无法弄清楚,并且已经搜索但找不到这个特定问题的答案。任何帮助都会很棒,因为我有 1000 多行并且没有手动删除它们!谢谢。

4

3 回答 3

1

处理此问题的标准方法是使用%in%运算符:

data[!(data$sp %in% "T"),]
于 2013-08-20T22:54:52.277 回答
0

which()命令不显示子集命令存在的问题。例如,

ID = c("R1","R2","R3","R4","R5","R6")
col1 = c(1.2,2.35,5,4.3,2.22,1.35)
sp = c("F","F",NA,NA,"T","F")

data = data.frame(ID,col1,sp)
data1 = data[-which(data$sp=="T"),]

产生:

> data
  ID col1   sp
1 R1 1.20    F
2 R2 2.35    F
3 R3 5.00 <NA>
4 R4 4.30 <NA>
5 R5 2.22    T
6 R6 1.35    F


> data1
  ID col1   sp
1 R1 1.20    F
2 R2 2.35    F
3 R3 5.00 <NA>
4 R4 4.30 <NA>
6 R6 1.35    F

只是为了确保您完全理解,which()找到向量 sp 中 T 所在位置的索引,即

> which(data$sp=="T")
[1] 5
于 2013-08-20T22:15:52.967 回答
0

您需要函数is.na和 OR ( |) 运算符的组合:

data1[!data1$sp | is.na(data1$sp),]

使用子集表示法:

subset(data1, !sp | is.na(sp))
于 2013-08-20T22:06:40.780 回答