2017-09-28 8 views
2

複数のサンプル実行(サンプルa、b、c、d)からの吸収スペクトルからなるデータフレームがあります。ここで、Ydataは波長であり、Xdataは吸収である。私は、関心のあるピークから離れた静かな波長範囲での平均吸収を差し引いて、ベースラインの補正された吸収を計算しています。ループなしのデータフレームで、そのレベルの別の因子のサブセットによって因子レベル内のデータを操作する方法

簡略化データフレーム:

DF <- data.frame(
    group = rep(c("a", "b", "c", "d"),each=10), 
    Ydata = rep(1:10, times = 4), 
    Xdata = c(seq(1,10,1),seq(5,50,5),seq(20,11,-1),seq(0.3,3,0.3)), 
    abscorr = NA 
) 

Iは、実行中のサブセット化波長範囲の平均値を減算することによって実行する各サンプルを修正する必要があります。私は、このようにそれをやってきた:

for (i in 1:length(levels(DF$group))){ 
    sub1 <- subset(DF, group == levels(DF$group)[i], select = c(group, Ydata, 
    Xdata)); 
    sub2 <- subset(sub1, Ydata > 4 & Ydata < 8, select = c(group, Ydata, 
    Xdata)); 
    sub1$abscorr <- sub1$Xdata - mean(sub2$Xdata); 
    DF <- rbind(sub1, DF); 
} 

とすべての「NAの

DF <- na.omit(DF) 

をアップし、その後整頓以上行わやり方は明らかにループを使用して不格好です。大規模なデータセットに対してこの作業を進めるには良い方法がありますか?おそらくdplyr?

答えて

2

dplyrをお試しください:

DF %>% 
    group_by(group) %>% 
    mutate(abscorr = Xdata - mean(Xdata[Ydata < 8 & Ydata > 4])) 
+0

MTに感謝します。治療をします。私は、dplyrパッケージがどのように働いていたかを頭に浮かべることができませんでした。 – Jordan

0

私はこれを行うと信じています。私はそれをテストしたとき、all.equal、すなわち二つの結果の属性が異なっている、私に違いのシリーズを与えたこと

fun <- function(x){ 
    x$Xdata - mean(x[which(x$Ydata > 4 & x$Ydata < 8), "Xdata"]) 
} 
DF$abscorr <- do.call(c, lapply(split(DF, DF$group), fun)) 

は注意してください。だから私は以下を走らせた。

fun <- function(x){ 
    x$Xdata - mean(x[which(x$Ydata > 4 & x$Ydata < 8), "Xdata"]) 
} 
DF2 <- DF 
DF2$abscorr <- do.call(c, lapply(split(DF2, DF2$group), fun)) 

all.equal(DF[order(DF$group, DF$Ydata), ], DF2) 
# [1] "Attributes: < Names: 1 string mismatch >"           
# [2] "Attributes: < Length mismatch: comparison on first 2 components >"     
# [3] "Attributes: < Component 2: names for target but not for current >"     
# [4] "Attributes: < Component 2: Attributes: < Modes: list, NULL > >"     
# [5] "Attributes: < Component 2: Attributes: < Lengths: 1, 0 > >"      
# [6] "Attributes: < Component 2: Attributes: < names for target but not for current > >" 
# [7] "Attributes: < Component 2: Attributes: < current is not list-like > >"    
# [8] "Attributes: < Component 2: target is omit, current is numeric >"     
# [9] "Component “abscorr”: Modes: numeric, logical"          
#[10] "Component “abscorr”: target is numeric, current is logical" 

あなたは何の違いは属性のみで、abscorrの計算値ではありません見ることができるように。これらのうち、na.omit属性またはrownames属性に違いがあります。 abscorrの値が等しいので、私があなたの場合は心配しません。

EDIT。
私がDFをソートし、問題の属性をNULLに設定した場合は、all.equalといっそう厳密なidenticalと返すTRUEの両方に注意してください。

DF1 <- DF[order(DF$group, DF$Ydata), ] # Modify a copy, keep the original 
row.names(DF1) <- NULL 
attr(DF1, "na.action") <- NULL 

all.equal(DF1, DF2) 
#[1] TRUE 
identical(DF1, DF2) 
#[1] TRUE 
+0

おかげルイ - 素敵なベース・R・ソリューション! – Jordan

関連する問題