簡體   English   中英

R 中的條件子集數據幀

[英]Conditionally subset data frame in 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,] 

返回滿足您條件的數據集。 這適用於 arrays 或數據幀。 但是請注意,原來的沒有改變,也不應該改變。

將來,請考慮在下面的代碼中包含一個可重現的示例。 它不必很復雜,但我認為你會發現制作一個的行為會澄清你的想法。 它對我有用!

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

我建議不要進行這種就地替換。 在某些情況下,這是必要的,但很少像您想象的那樣頻繁。

原因?

如果您避免破壞性子集,並且出現問題,您可以輕松地返回到最初加載的數據框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM