在R中条件子集数据帧



我有一个数据帧,它有10列510行。我试图创建它的一个子集,其中如果前5列的行和等于0,则整个行将被丢弃。我读过这个网站上的帖子,说你不能简单地删除R中的行,所以我尝试了以下方法:

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

然而,data_sub最终成为数据的副本。。。我真的不知道为什么。。。请告知!此数据帧没有Inf或NaN值,只有整数。

尝试以下操作:

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

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

这就是您想要的

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),] 

我建议不要用这种原地换人的方式。在某些情况下,这是必要的,但很少像你想象的那样频繁。

原因

如果你避免了破坏性的子集设置,并且出现了问题,你可以很容易地返回到最初加载的数据帧

最新更新