[英]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.