R中的条件子集数据帧

时间:2019-10-25 19:07:12

标签: r dataframe sum subset

我有一个包含10列和510行的数据框。我正在尝试创建其中的一个子集,如果其中前5列的行总和等于0,则会丢弃整个行。我已经阅读了该网站上的帖子,说您不能简单地删除R中的行,所以我尝试了以下操作:

    data_sub <- data[!sum(data[, 1:5]==0), ]

但是,data_sub最终是数据的副本...我真的不确定为什么...请指教!该数据帧没有Inf或NaN值,只有整数。

2 个答案:

答案 0 :(得分:1)

尝试以下操作:

/**
 * Staff
 *
 * @ORM\Table(name="staff")
 * @ORM\Entity
 */
class Staff extends User
{
...

    /**
     * @ORM\OneToOne(targetEntity="Organization", mappedBy="staff")
     */
    protected $organization;

    public function getOrganization()
    {
        return $this->organization;
    }

    public function setOrganization(Organization $organization = null)
    {
        $this->organization = $organization;

        return $this;
    }
}

ind <- apply(data, 1, function(x) sum(x[1:5]) != 0)
data_sub <- data[ind, ]

答案 1 :(得分:1)

这就是你想要的

reprex[sum(reprex[,1:5])!=0,] 

返回符合您条件的数据集。这适用于数组或数据帧。但是请注意,原始的未更改,也不应该

将来,请考虑在下面的代码中包括一个可复制的示例。它不一定很复杂,但是我认为您会发现做出一个人的举止可以澄清您的想法。对我有用!

# emily example

# sample column as a 50% chance of being zero and 50 percent chance of random 
set.seed(152)
sample_column<-function(col_length) {
  ifelse(runif(col_length)<0.5,0,runif(col_length))
}

# produce some columns of random numbers.  Spike it with 
# zeroes to make the filter actually catch some.

make_reprex<-function(nrows,ncols) {
  id=1:nrows
  colnames=paste0('x',1:ncols)
  data=matrix(nrow=nrows,ncol=ncols)
  rownames(data)=id
  colnames(data)=colnames
  for (j in 1:ncols) {
    data[,j]=sample_column(nrows)
  }
  return(data)
}

reprex=make_reprex(510,15)
# desired expression 
reprex[sum(reprex[,1:5]!=0),] 

如果您希望对数据进行子集化处理,则需要进行其他分配。

reprex=reprex[sum(reprex[,1:5]!=0),] 

我建议不要使用这种就地替换。在某些情况下,有必要这样做,但是却很少出现您想像的那样。

原因?

如果避免破坏性的子设置,并且出了点问题,则可以轻松返回到原始加载的数据框。