我有一个 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时,但它非常慢并且花了很长时间来编译。
答案 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的副本,带有一堆不相关的行和列。在额外的填充单元中你想要什么值?