2016-11-21 137 views
0

我有一個名爲ls.df.val.dcas的數據幀列表。每個數據幀都有不同的列,其中某些缺失值是NA。我想使用lappy()到列表中,這樣我就可以刪除超過X%(例如40%)的值爲NA的那些列。爲了讓你的列表中的dataframes看怎麼樣我顯示的示例圖:如何使用lapply刪除R中列表中有太多缺失值的列?

$ SK_VALUES_IMV_EU28_INTRA :'data.frame': 74 obs. of 65 variables: 
    ..$ PERIOD : Date[1:74], format: "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ... 
    ..$ 2207 : num [1:74] 1078759 1850083 1872924 1038070 626471 ... 
    ..$ 2208 : num [1:74] 3329179 7061890 1351550 1371469 1557605 ... 
    ..$ 220710 : num [1:74] 1030704 1804495 1831958 972263 574855 ... 
    ..$ 220720 : num [1:74] 48055 45588 40966 65807 51616 ... 
    ..$ 220820 : num [1:74] 380843 1014933 71804 126348 138138 ... 
    ..$ 220830 : num [1:74] 380007 459653 155033 205879 297446 ... 
    ..$ 220840 : num [1:74] 41561 88449 31549 60768 117534 ... 
    ..$ 220850 : num [1:74] 94483 340439 44949 32949 37550 ... 
    ..$ 220860 : num [1:74] 371217 728521 143974 179311 254546 ... 
    ..$ 220870 : num [1:74] 731231 1374532 228087 227772 230129 ... 
    ..$ 22082014: num [1:74] NA 2531 1776 NA NA ... 
$ RO_VALUES_IMV_EU28_EXTRA :'data.frame': 74 obs. of 44 variables: 
    ..$ PERIOD : Date[1:74], format: "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ... 
    ..$ 2207 : num [1:74] NA NA NA NA NA 5 NA NA NA NA ... 
    ..$ 2208 : num [1:74] 312035 840540 315008 884357 100836 ... 
    ..$ 220710 : num [1:74] NA NA NA NA NA 5 NA NA NA NA ... 
    ..$ 220720 : num [1:74] NA NA NA NA NA NA NA NA NA NA ... 
    ..$ 220820 : num [1:74] 3570 698 483 1087 1802 ... 

我的不完整的解決方案是基於計數每個數據幀的每一列NA的數量,並計算NA的百分比。然後刪除百分比大於X%的那些列。

# Counting the number of NA 
ls.Nan <- lapply(ls.df.val.dcas, function(x) colSums(!is.na(x))) 
# Calculating the lengths of all column 
ls.size <- lapply(ls.df.val.dcas, function(x) dim(x)) 

# we want the first element of size which shows the number of rows. 
ls.percen <- mapply(function(x,y) x/y[1] , x=ls.Nan, y=ls.size) 
# keeping those columns that have more than half of the data on that category 

mis.list <- sapply(ls.df.val.dcas, "]]" sapply(ls.percen, function(x) x >= NPI)) 

我從運行最後一行得到以下錯誤。

Error: unexpected symbol in "mis.list <- sapply(ls.df.val.dcas, "]]" sapply" 

最終我還想將所有這些函數合併成一個函數,然後使用lapply一次。但現在,我正在努力理解應用於數據框列表的lapply索引系統。如果任何人可以用一個例子來演示如何使用不同粒度的列表來使用lapply,那就太棒了。例如,如果要更改列表中的列表或數據框的元素或列表的數據框中的列,應如何編寫函數。

編輯 鑑於下面關於忘記在「]]之後加逗號的評論」。我糾正了代碼,但仍然得到錯誤

> mis.list <- sapply(ls.df.val.dcas, "]]", sapply(ls.percen, function(x) x >= NPI)) 
Error in get(as.character(FUN), mode = "function", envir = envir) : 
    object ']]' of mode 'function' was not found 

順便說一句,在NPI是在列的NAS只是一個百分比閾值。例如,我已將它設置爲NPI = 0.35

由於我懷疑存在與我的數據結構有關的錯誤,因此我添加了關於ls.percen結構的更多信息。

> str(ls.percen) 
    List of 69 
    $ AT_VALUES_IMV_EU28_EXTRA : Named num [1:59] 1 0.635 1 0.378 0.338 ... 
     ..- attr(*, "names")= chr [1:59] "PERIOD" "2207" "2208" "220710" ... 
    $ AT_VALUES_IMV_EU28_INTRA : Named num [1:67] 1 0.986 0.986 0.986 0.986 ... 
     ..- attr(*, "names")= chr [1:67] "PERIOD" "2207" "2208" "220710" ... 
    $ BE_VALUES_IMV_EU28_EXTRA : Named num [1:57] 1 1 1 1 0.365 ... 
     ..- attr(*, "names")= chr [1:57] "PERIOD" "2207" "2208" "220710" ... 
    $ BE_VALUES_IMV_EU28_INTRA : Named num [1:69] 1 0.986 0.986 0.986 0.986 ... 
     ..- attr(*, "names")= chr [1:69] "PERIOD" "2207" "2208" "220710" ... 

回答

0

可能是一個簡單的拼寫錯誤(而不是通過索引的問題):該消息說你缺少一個逗號,這或許應該是:

mis.list <- sapply(ls.df.val.dcas, "]]", sapply(ls.percen, function(x) x >= NPI)) 

我們沒有看到一個定義'NPI'。可能是簡單與合併兩個率先「lapply」電話(和返回短路DF的期望的列表):

mis.lst <- lapply(ls.df.val.dcas, 
        function(x) x[ , colSums(!is.na(x))/nrow(x) > .40 ]) 

您可以使用邏輯索引中的「J」位置的「[這兩個參數版本」。

+0

謝謝你的回答。即使我糾正了錯字並添加了逗號,第一行代碼仍然不起作用。第二條建議的代碼行完美地工作。 – Micromann

+0

我可以問你另一個問題嗎?我現在如何使用適用的家庭功能之一,將列表中所有數據框和列的NA替換爲零?以下代碼行不起作用:basic.lst < - lapply(mis.lst,function(x)x [is.na(x)] < - 0) – Micromann

+0

這是多次詢問問題的副本在SO上。你需要搜索_before_提問。 –