我正在尝试使用指标从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.
有什么建议吗?我将在众多数据集中进行比较。
在此先感谢,我已经四处寻找并且无法提出任何好的想法。
答案 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`