如何在不删除列或行的情况下清除或删除数据集中的NA值

时间:2016-01-05 18:48:55

标签: r na

是否有优雅的解决方案从NA值清除数据帧而不删除NA所在的行或列?

示例:

输入数据框

    C1    C2     C3
 R1  A   <NA>  <NA>
 R2 <NA>  A    <NA>
 R3 <NA> <NA>   A
 R4  B   <NA>  <NA>
 R5 <NA>  B    <NA>
 R6 <NA> <NA>  <NA>
 R7  C   <NA>   B
 R8       C    <NA>
 R9            <NA>
 R10           <NA>
 R11            C

输出数据框

    C1  C2  C3
R1  A   A   A
R2  B   B   B
R3  C   C   C

例如,这是一个杂乱的数据帧(df1),其中包含NA值

    A       B       C       D       E       F    G    H    I    J    K
1 Healthy    <NA>    <NA>    <NA>    <NA>    <NA> <NA> <NA> <NA> <NA> <NA>
2    <NA> Healthy    <NA>    <NA>    <NA>    <NA> <NA> <NA> <NA> <NA> <NA>
3    <NA>    <NA> Healthy    <NA>    <NA>    <NA> <NA> <NA> <NA> <NA> <NA>
4    <NA>    <NA>    <NA> Healthy    <NA>    <NA> <NA> <NA> <NA> <NA> <NA>
5    <NA>    <NA>    <NA>    <NA> Healthy    <NA> <NA> <NA> <NA> <NA> <NA>
6    <NA>    <NA>    <NA>    <NA>    <NA> Healthy <NA> <NA> <NA> <NA> <NA>

以下是数据帧的应用方式。

   X1        X2        X3      X4        X5        X6        X7      X8      X9       X10       X11
1 Healthy   Healthy   Healthy Healthy   Healthy   Healthy   Healthy Healthy Healthy   Healthy   Healthy
2 Healthy   Healthy   Healthy Healthy   Healthy   Healthy   Healthy Healthy Healthy   Healthy   Healthy
3 Healthy ICDAS_1_2 ICDAS_1_2 Healthy ICDAS_1_2 ICDAS_1_2 ICDAS_1_2 Healthy Healthy ICDAS_1_2 ICDAS_1_2
4 Healthy   Healthy   Healthy Healthy   Healthy   Healthy   Healthy Healthy Healthy   Healthy   Healthy
5 Healthy   Healthy   Healthy Healthy   Healthy   Healthy   Healthy Healthy Healthy   Healthy   Healthy
6 Healthy   Healthy   Healthy Healthy   Healthy   Healthy   Healthy Healthy Healthy   Healthy   Healthy

请注意,原始数据帧中的单元格B-2现在位于X2-1中。因此,这里的主要问题是找到等同于&#34;删除单元格并移动所有单元格&#34;来自Calc或Excel的功能

我找到的所有答案都删除了&lt; NA&gt;的所有行或列。价值是。 我设法做到的方式是(并且如果这是原始的,那就是抱歉)只将有效值提取到新的数据帧:

首先。我创建了一个空数据框

library("data.table") # required package
new_dataframe <-  data.frame(matrix("", ncol = 11, nrow = 1400) )

然后,我将每个有效值从旧数据帧复制到新数据帧

new_dataframe$X1 <- df1$A[!is.na(df2$A)]
new_dataframe$X2 <- df1$B[!is.na(df2$B)]
new_dataframe$X3 <- df1$C[!is.na(df2$C)]

所以,我的问题是:是更优雅的解决方案&#34; clean&#34;来自NA值的数据框?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果这适用于您:

new_dataframe$X1 <- df1$A[!is.na(df2$A)]
new_dataframe$X2 <- df1$B[!is.na(df2$B)]
new_dataframe$X3 <- df1$C[!is.na(df2$C)]

然后这应该自动工作:

new_dataframe = as.data.frame(lapply(df1, na.omit))

也应该有效(在任意数量的列上)。 (更直接的代码翻译是皮埃尔在评论中提出的建议:as.data.frame(lapply(mydf, function(x) x[!is.na(x)]))。)

小心数据框必须是矩形(每列必须具有相同的行数),因此这可能会像您希望的那样工作,并且只能如果每列具有相同数量的非缺失值。如果某些行具有较少的非缺失值,则它们将被回收以填充数据帧的长度:

x = data.frame(a = c(1, NA, 2), b = c(2, NA, 3), c = c(NA, "A", NA))
x
#    a  b    c
# 1  1  2 <NA>
# 2 NA NA    A
# 3  2  3 <NA>

as.data.frame(lapply(x, na.omit))
#   a b c
# 1 1 2 A
# 2 2 3 A

更好的方法可能是首先转换为列表:

y = lapply(x, na.omit)

在决定是否要强制使用数据框之前,您可以查看自己拥有的内容sapply(y, length)