如何从列表中的所有数据框中删除行?

时间:2018-04-09 21:57:42

标签: r

我正在尝试从列表中的所有数据框中删除该行。我不知道怎么做。

数据的基本结构是一个列表中的所有五个插补数据帧。 如果某些数据帧不满足条件,我试图从那些数据帧中删除行(例如,col3< = 0,即删除具有负col3值的行)。通过这种方式,我可以以适当的方式比较所有数据帧。

这与上一个问题有关:

How can I have a subset of a list of data frames?

(加法) 例如,我有以下数据框列表

 > temp <- list (
 data.frame(house=c(1,-3,-2), income=c(2,3,4), capital=c(3,5,6)),
 data.frame(house=c(1,-3,-2), income=c(2,3,4), capital=c(3,5,6)),
 data.frame(house=c(1,-3,NA), income=c(2,3,4),capital=c(3,5,6))
  )

> temp
[[1]]
  house income capital
1     1      2       3
2    -3      3       5
3    -2      4       6

[[2]]
  house income capital
1     1      2       3
2    -3      3       5
3    -2      4       6

[[3]]
  house income capital
1     1      2       3
2    -3      3       5
3    NA      4       6

现在,我希望列出没有'house&lt; = 0' 所以我想做这样的事情,

temp <- subset(temp, house>0)

首先,这段代码不起作用..我不知道为什么......第二,我的代码中的另一个列表能够执行子集函数。然而,事情是三个数据帧在更改后不平衡。这是由于第3个数据帧中的NA。它没有丢弃第3个数据帧的第3行,因此整个列表不平衡。

从上一个问题可以看出,我正在研究消费者金融调查数据集,他们在列表中有5个插补数据框,当我尝试从整个列表中修剪负房屋价值行时,它只会被删除一些数据框架。我想有一个完整的公共数据集和一个提取数据集,后者不包括房屋栏.....

2 个答案:

答案 0 :(得分:2)

这是你之后的事吗?

lapply(temp, function(x) subset(x, house > 0))
#[[1]]
#
#  house income capital
#1     1      2       3
#[[2]]
#
#  house income capital
#1     1      2       3
#[[3]]
#
#  house income capital
#1     1      2       3

或者用

可以实现同样的目的
lapply(temp, function(x) x[x$house > 0 & !is.na(x$house), ])

答案 1 :(得分:0)

来自filter

tidyverse
library(tidyverse)
temp %>% 
     map(filter, house > 0)
#[[1]]
#  house income capital
#1     1      2       3

#[[2]]
#  house income capital
#1     1      2       3

#[[3]]
#  house income capital
#1     1      2       3