从NA行蔓延开始过滤数据帧

时间:2016-11-20 07:58:20

标签: r subset na

我正在尝试使用整个数据帧上的逻辑运算符来过滤数据帧,并且在子集化数据帧中以某种方式NA行正在爬行。我已经完成了Subsetting R data frame results in mysterious NA rowsSubsetting R data frame results in mysterious NA rows,但我无法找到或找到解决方案。

df <- data.frame(number1 = c(1:5,-13,-2,-34,24,33), number2 = c(10:3, -73, -82))
df
df[df>=0 & !is.na(df$number2),]

我正在尝试过滤,以便在原始数据框中的任何行中都没有负值。我最终获得了18行df和多个NA行。

我尝试在我的df上使用sapply检查逻辑操作是否正常。但如果我用“哪个”包裹,我会得到所有18行。

sapply(names(df), function(x) df[x]>=0)

我的目标是获得任何列中没有负值的df。

编辑:在我的情况下,我不知道在过滤它们之前生成的df会有多少列。因此,使用&amp;运营商是不可能的。这正是我试图应用逻辑运算符或整个df

的原因

3 个答案:

答案 0 :(得分:1)

首先,您需要将矩阵缩减为单个向量。如果要将其概括为任意数量的列,则可以执行

df[Reduce(`&`, lapply(df, `>=`, 0)), ]
#   number1 number2
# 1       1      10
# 2       2       9
# 3       3       8
# 4       4       7
# 5       5       6

OR

df[rowSums(df >= 0) == ncol(df), ]
#   number1 number2
# 1       1      10
# 2       2       9
# 3       3       8
# 4       4       7
# 5       5       6

答案 1 :(得分:0)

问题是你试图对行进行过滤,这意味着你应该将1d逻辑向量传递给选择器,而是传递2d逻辑矩阵。使用此矩阵作为选择器意味着不必对行进行过滤,只会删除这些值。

如果您执行以下操作,它将删除所有具有负值但没有任何结果NAs的行

<ul>
                    <li>
                        <div class="thumbContainer">
                        <img src="Images/7.jpg" alt="Willian Borges" >
                        </div>
                        <div class="latest-news-container">
                        <h3>Willian Aiming for the Top</h3>
                        <p>
                            The former Liverpool midfielder will have brought back painful memories for Jose Mourinho and Chelsea fans after he posted a hilarious nod to the
                            infamous "ghost goal" incident from the 2004-05 season.... <a class="btn" href="#">Read more</a>
                        </p>
                        </div>

                    </li>

                    <li>
                        <div class="thumbContainer">
                        <img src="images/8.jpg" alt="Lukaku" >
                        </div>
                        <div class="latest-news-container">
                        <h3>Lukaku Goal Drought Continues</h3>
                        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent euismod ultrices ante, ac laoreet nulla vestibulum adipiscing. Nam quis justo in augue auctor imperdiet.</p>
                        </div>
                    </li>

                    <li>
                        <div class="thumbContainer">
                        <img src="images/9.jpg" alt="Hart">
                        </div>
                        <div class="latest-news-container">
                        <h3>Bad Treatment at the City</h3>
                        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent euismod ultrices ante, ac laoreet nulla vestibulum adipiscing. Nam quis justo in augue auctor imperdiet.</p>
                        </div>
                    </li>

                    <li>
                        <div class="thumbContainer">
                        <img src="images/10.jpg" alt="Ronaldo">
                        </div>
                        <div class="latest-news-container">
                        <p>
                        <h3>CR7 Smiling to the Bank</h3>
                        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                            Praesent euismod ultrices ante, ac laoreet nulla vestibulum adipiscing. Nam quis justo in augue auctor imperdiet.</p>
                        </p>
                        </div>
                    </li>
                </ul>

其中df <- data.frame(number1 = c(1:5,-13,-2,-34,24,33), number2 = c(10:3, -73, -82)) df df[df[,1]>=0 & df[,2]>=0,] 返回两列均为正的行的1d逻辑向量。

答案 2 :(得分:0)

尝试以下方法。在您想要的条件之间使用 AND

> df[df$number1>0 & df$number2>0,]
  number1 number2
1       1      10
2       2       9
3       3       8
4       4       7
5       5       6