在R中引用其他数据后,有条件地删除变量

时间:2014-08-22 18:58:37

标签: r

我正在尝试使用指标从R中的数据矩阵中删除值,但是我希望它们仅在其他.csv文件或数据矩阵中不存在的警告中消除。

我可以使用Subset函数从数据框中消除值,但这只是在同一个数据文件中。我基本上喜欢搜索其他数据文件并保留该行(如果它存在于另一个数据文件中)。

Data 1
ID     Value     Value 2     Elimination Metric
1       23         23            0.05
2       34         45            0.09              
3       89         11          **0.12**              
4       76         17          **0.11**        
5       01         22            0.02

因此,如果我的指标阈值仅保持低于0.1的样本,那么我想要消除ID 3& 4来自我的数据框。但如果它们存在于数据集2中,我想保留它们

Data 2
    ID     Value     Value 2     Elimination Metric
    1       23         23            0.020
    2       34         45            0.018              
    3       89         11          **0.12**              
    4       76         17          **0.09**        
    5       01         22            0.03

因此,数据2的阈值高于我的阈值3,低于4。所以我想摆脱ID 3,但保持4.

有什么建议吗?我将在众多数据集中进行比较。

在此先感谢,我已经四处寻找并且无法提出任何好的想法。

1 个答案:

答案 0 :(得分:0)

您可以使用合并功能,例如:

# example data (N.B. I've added one row to data1 not present in data2)
data1 <- read.csv(text=
'ID,Value,Value 2,Elimination Metric
1,23,23,0.05
2,34,45,0.09              
4,76,17,0.11        
5,01,22,0.02
3,89,11,0.12    
5,02,34,0.20', check.names=F)
data2 <- read.csv(text=
'ID,Value,Value 2,Elimination Metric
1,23,23,0.05
2,34,45,0.09              
3,89,11,0.12              
4,76,17,0.09        
5,01,22,0.02', check.names=F)

# merge the 2 data.frame's using ID,Value and Value 2 as keys,
# * all.x=T means all the rows of data1 will be present and joined 
#   with the equal row of data2
# * sort=F guarantees that the original data1 order is kept
df <- merge(x=data1,y=data2,by=c("ID","Value","Value 2"),all.x=T,sort=F)

# replace NAs (i.e. rows present only in data1) 
# with a invalid value for the filter (i.e. > 0.1)
df[is.na(df[,"Elimination Metric.y"]),"Elimination Metric.y"] <- 1

# construct the boolean filter
filter <- df[,"Elimination Metric.x"] < 0.1 | df[,"Elimination Metric.y"] < 0.1

# filter the merged data.frame
dfFilt <- df[filter,]
# or if you prefer you can directly filter your original data1
data1Filt <- data1[filter,]

结果:

> dfFilt
  ID Value Value 2 Elimination Metric.x Elimination Metric.y
1  1    23      23                 0.05                 0.05
2  2    34      45                 0.09                 0.09
3  4    76      17                 0.11                 0.09
4  5     1      22                 0.02                 0.02

> data1Filt
  ID Value Value 2 Elimination Metric
1  1    23      23               0.05
2  2    34      45               0.09
3  4    76      17               0.11
4  5     1      22               0.02

N.B。

建议不要在data.frame中使用无效的列名(例如带空格的名称)。您应该考虑将"Value 2"重命名为"Value2""Value.2""Value_2"

通过这种方式,例如使用$进行列选择将更容易,即:

data1$Value2

而不是:

data1$`Value 2`