我有一个名为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" ...
谢谢你的回答。即使我纠正了错字并添加了逗号,第一行代码仍然不起作用。第二条建议的代码行完美地工作。 – Micromann
我可以问你另一个问题吗?我现在如何使用适用的家庭功能之一,将列表中所有数据框和列的NA替换为零?以下代码行不起作用:basic.lst < - lapply(mis.lst,function(x)x [is.na(x)] < - 0) – Micromann
这是多次询问问题的副本在SO上。你需要搜索_before_提问。 –