我有一個包含數千行和3列的數據框:值,實驗和比率。值包含值(正值和負值);試驗實驗編號(E1,E2或E3),比例包含三個項(X.Y,Y.Z或Z.X)中的一個。R中的數據子集
我需要爲這三個比率中的每一個提取最接近0的50個值的所有列,同時銘記這很可能是正值和負值的混合。
我能想到的唯一(天真的)方式是爲每個比率子集/提取數據,然後根據數值對數據進行排序(排序),然後再次選擇子集以獲得最接近0和25的25個負值值最接近0.
有沒有更好的方法?
我有一個包含數千行和3列的數據框:值,實驗和比率。值包含值(正值和負值);試驗實驗編號(E1,E2或E3),比例包含三個項(X.Y,Y.Z或Z.X)中的一個。R中的數據子集
我需要爲這三個比率中的每一個提取最接近0的50個值的所有列,同時銘記這很可能是正值和負值的混合。
我能想到的唯一(天真的)方式是爲每個比率子集/提取數據,然後根據數值對數據進行排序(排序),然後再次選擇子集以獲得最接近0和25的25個負值值最接近0.
有沒有更好的方法?
我的解決方案使用由訂購和:
by(df, df$RATIO, function(x) x[ order(abs(x$VALUE))[1:50] , ])
這將返回一個列表,包含一個子集的每個元素。
這是fab-ta非常!我不知道「通過」存在 - 非常有用! – Kvothe
的情況下,一個data.table解決方案,您有許多行:
set.seed(1)
N <- 1e6
library(data.table)
dat <- data.table(value = runif(N,-100,100),
experiment = sample(paste0('E',1:3),N,rep=T),
ratio= sample(c('X.Y', 'Y.Z','Z.X'),N,rep=T))
dat[,{id <- order(abs(value))[1:50]
list(value=value[id],
experiment=experiment[id])
} ,by='ratio']
提供一個可重複的例子,你已經嘗試過什麼。 – stanekam
只需按絕對值排序以獲得最接近0的值:對應於最小50個絕對值的行。 –
你的天真的方式不符合既定的目標。 50個「最接近」的數值在理論上可能都大於0. –