如何在嵌套数据框中删除带NA的行?

时间:2015-03-05 07:47:38

标签: r

可能重复:

Remove rows with NAs (missing values) in data.frame

How to remove "rows" with a NA value?

我有一个嵌套的数据框,包含约400行的大约400个文件。我想从嵌套数据框df中删除NA的所有行。我试过na.omit(df)但似乎没有用。我不确定我是否在这里遗漏了一些东西。感谢。

 df

[[1]]
    V1              V2           V3
1   ID SignalIntensity          SNR
2  109    6.1823089314 0.8453576915
3  110   10.1727771385 4.3837077591
4  111    7.2922746927           NA
5  112    8.8984671629 2.3192184908
6  113              NA 3.7133402249
7  114    7.9850187685 1.5008899345
8  116    7.7893230124           NA
9  117    7.1948346495  1.134973824
10 118    6.5727729751 0.9041846475
11 119              NA 0.7098581049
12 120    9.3711264685 2.9968456969
13 121    6.1549436434 0.7777584058


[[2]]
    V1              V2           V3
1   ID SignalIntensity          SNR
2  118    6.5727729751 0.9041846475
3  119    5.3775194293           NA
4  120    9.3711264685 2.9968456969
5  121    6.1549436434 0.7777584058
6  123    5.7974462402 0.7235424803
7  124              NA 0.7019574482
8  125    7.0145371807  0.343334334
9  126    6.0891591319  0.797164982
10 127    6.3148197657 0.7845943688

[[3]]
    V1              V2           V3
1   ID SignalIntensity          SNR
2  109    6.1823089314 0.8453576915
3  110   10.1727771385 4.3837077591
4  111    7.2922746927 1.0725751161
5  112    8.8984671629           NA
6  113    9.5910338232 3.7133402249
7  114    7.9850187685 1.5008899345
8  116    7.7893230124 1.3636655582
9  117    7.1948346495           NA
10 118    6.5727729751 0.9041846475
11 119    5.3775194293 0.7098581049
12 120    9.3711264685 2.9968456969

我的最终数据应如下所示。

 df
[[1]]
    V1              V2           V3
1   ID SignalIntensity          SNR
2  109    6.1823089314 0.8453576915
3  110   10.1727771385 4.3837077591
5  112    8.8984671629 2.3192184908
6  113    9.5910338232 3.7133402249
7  114    7.9850187685 1.5008899345
9  117    7.1948346495  1.134973824
10 118    6.5727729751 0.9041846475
12 120    9.3711264685 2.9968456969
13 121    6.1549436434 0.7777584058


[[2]]
    V1              V2           V3
1   ID SignalIntensity          SNR
2  118    6.5727729751 0.9041846475
4  120    9.3711264685 2.9968456969
5  121    6.1549436434 0.7777584058
6  123    5.7974462402 0.7235424803
8  125    7.0145371807  0.343334334
9  126    6.0891591319  0.797164982
10 127    6.3148197657 0.7845943688

[[3]]
    V1              V2           V3
1   ID SignalIntensity          SNR
2  109    6.1823089314 0.8453576915
3  110   10.1727771385 4.3837077591
4  111    7.2922746927 1.0725751161
6  113    9.5910338232 3.7133402249
7  114    7.9850187685 1.5008899345
8  116    7.7893230124 1.3636655582
9  117    7.1948346495  1.134973824
10 118    6.5727729751 0.9041846475
11 119    5.3775194293 0.7098581049
12 120    9.3711264685 2.9968456969

2 个答案:

答案 0 :(得分:6)

df是' data.frames'的列表。因此,您可以使用lapply

lapply(df, na.omit)

观察到的另一件事是数据框列表中的第一行是'字符'。我假设您使用read.table header=FALSE,而标题实际上就在那里。可能是,您需要使用

再次读取文件
files <- list.files #if all the files are in the working directory
lst <- lapply(files, read.table, header=TRUE, stringsAsFactors=FALSE)
lapply(lst, na.omit)

答案 1 :(得分:0)

purrr库也可以与na.omit一起使用

map(df, na.omit)

另一种方法是在地图中创建匿名函数,如

map(df, ~(.x %>% filter(complete.cases(.))))

如果您想保留NA记录以供以后调查(一种很好的做法),那么最后的迭代可能会很有用。只需为具有NA的任何行添加not !限定词,即可:

map(df, ~(.x %>% filter(!complete.cases(.))))

最后,如果您最关心的是进行计算,则可以考虑将所有NA替换为0:

map(df, ~replace(., is.na(.), 0) )