选择data.frame中的所有非NA值并将它们复制到新变量

时间:2017-07-31 08:53:04

标签: r dataframe

我有一个data.frame,主要是NA值和一些数据。要清理它,我需要选择并复制所有NA值(不是包括NA的行或列,而只是值)。这似乎是一项简单的任务,但到目前为止我没有尝试过任何解决方案。我想明确表示我不想在结果变量/文件中保持行数完整,而是逐个逐列删除所有NA值。好像这些列中的单个列表和我将所有单元格排序到顶部,其中包含信息/值,所有单元格都是NA到底部。

谢谢。

更新示例:

# Load the regressor
if isinstance(regressor, XGBRegressor):
    regressor = XGBRegressor()
    r = pickle.load(open(fname, "rb" ))
    print r.get_xgb_params()
    regressor._Booster = r._Booster
    regressor.set_params(**r.get_xgb_params())

# Do the prediction
y_predict = regressor.predict(X_test)

期望的结果:

Col 1   Col 2   Col 3
Bar     NA      But
NA     There    NA
Foo     NA      NA
NA      NA      Not
NA      NA      NA
Here    NA      NA
NA    Better    NA

我需要保持列完整,但在列中所有值都应该向上移动。因此,如果我可以选择所有非NA值并将它们粘贴到新的数据帧(或其他任何内容)中,那么它包含相同数量的列但只包含值,而不是NAs。

希望能让它更清晰。谢谢。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,这就是您想要的:

# sample data

df  = data.frame(a=c(1,NA,2),b=c(NA,NA,4))
df2 = lapply(df, function(x) {x[!is.na(x)]})
df3 = sapply(df2, '[', seq(max(sapply(df2,length))))

输入:

   a  b
1  1 NA
2 NA NA
3  2  4

输出1,作为列表列表:

> df2
$a
[1] 1 2

$b
[1] 4

输出2,作为数据帧:

> df3
     a  b
[1,] 1  4
[2,] 2 NA

希望这有帮助!