如果row.names / col.names包含R中另一个数据帧的row.names / col.names中的字符,则删除整行/列

时间:2016-05-11 20:43:54

标签: r

我有一个 n x 1 df_vector向量,如下所示:

Var1:M1 2.5
Var1:M2 3.8
Var1:M3 NaN
Var1:M4 9.3
Var2:M1 0.1
Var2:M2 2.3
Var2:M3 8.8
Var2:M4 NaN

然后我有一个 n x n df_matrix矩阵:

        Var1:M2 Var1:M3 Var1:M4 Var2:M1 Var2:M2 Var2:M3 Var2:M4
Var1:M1 46900   788888  700000  490603  479063  6468000 649111
Var1:M2 52823   543189  431863  134696  413000  4980000 550690
Var1:M3 34343   543199  543169  413000  479006  4689703 567000
Var1:M4 56655   745893  134000  130000  463090  9806300 790643
Var2:M1 87676   413596  156000  546970  310000  9730000 700000
Var2:M2 67786   124397  134680  546300  146900  1312600 669000
Var2:M3 45332   417933  203333  131588  137900  4690530 978000
Var2:M4 32422   660796  314796  786000  479000  7690000 796080

我想要做的是:如果df_vector中的行有NaN值,则使用其row.name并在df_matrix中搜索它并完全删除任何包含和/或列的行与df_vector中存在NaN值的row.name相同的名称。但同时将这些已删除的列/行以相同的顺序保存到新的数据框中。因此,在此特定示例中,在df_vector中,Var1:M3和Var2:M4具有NaN值,因此从df_matrix行中具有名称Var1:M3和Var2:M4应该被完全删除,并且具有名称Var1:M3的列和Var2:M4也应该被完全删除。这些删除的行和列应该以与df_matrix相同的格式创建一个新的数据帧。

实现这一目标的最佳方法是什么?由于我的原始数据集是10,000 x 10,000矩阵,当我尝试写if和for时,但它非常慢并且花了很长时间来编译。

1 个答案:

答案 0 :(得分:0)

我认为避免循环会更快。最简单的方法是分两步完成。

# remove rows and then remove columns
df_matrix[is.nan(df_vector[,1]),] <- NULL
df_matrix <- df_matrix[,!is.nan(df_vector[,1])]

如果列名和行名与两个数据框中的顺序完全匹配,则上述代码可能无法正常工作。如果是这种情况,则从df_vector获取行名称,并使用%in%来保留这些特定的行和列。对于保留已删除数据的第二部分,它不清楚你想要什么,因为它基本上是现有df_matrix的副本,带有一堆不相关的行和列。在额外的填充单元中你想要什么值?