1

次のように簡略化されたデータフレームがあります。

head(dendro)
  X            DateTime   ID diameter dendro ring DOY month mday year Rain_mm_Tot Through_Tot temp
1 1 2012-06-21 13:45:00 r1_1     5482      1    1 173     6   22  113          NA          NA   NA
2 2 2012-06-21 13:45:00 r2_3       NA      3    2 173     6   22  113          NA          NA   NA
3 3 2012-06-21 13:45:00 r1_2     5534      2    1 173     6   22  113          NA          NA   NA
4 4 2012-06-21 13:45:00 r2_4       NA      4    2 173     6   22  113          NA          NA   NA
5 5 2012-06-21 13:45:00 r1_3     5606      3    1 173     6   22  113          NA          NA   NA
6 6 2012-06-21 13:45:00 r2_5       NA      5    2 173     6   22  113          NA          NA   NA

データフレームは最初に「ID」で分割されるため、IDのリストになります。その後、ループを含む関数を適用すると、結果は新しい列「Diameter2」になり、関数から必要な結果が機能します。わかった:

dendro_sp <- split(dendro, dendro$ID)

library(changepoint)

dendro_sp <- lapply(dendro_sp, function(x){

 x <- subset(x, !is.na(diameter))
 cpfit <- cpt.mean(x$diameter, method="BinSeg")

 x$diameter2 <- x$diameter
 cpts <- cpfit@cpts
 means <- param.est(cpfit)$mean
 meanZero <- means[1]

 for(i in 1:(length(cpts)-1)){
   x$diameter2[(cpts[i]+1):cpts[i+1]] <- x$diameter2[(cpts[i]+1):cpts[i+1]] + (meanZero - means[i+1])
 }

 return(x)
})
dendro2 <- do.call(rbind, dendro_sp)
rownames(dendro2) <- NULL

私の問題は、条件付きで、たとえばr1_1とr1_3に適用し、残りのIDに関数を適用する代わりに、新しい列「diameter2」でr3の「diameter」値を取得することです。

ifelse(diameter$ID==c("r1_1","r1_3"), apply_the_function_to_r11_and_r13_to_calculate_diameter2, otherwise_write_diameter_value_in_diameter2_column)  

データフレーム「dendro」はIDで分割されていることを思い出してください。それが、複数のIDの条件を定義するために重要かどうかはわかりません。ありがとう

4

1 に答える 1

0

問題を正しく理解しているかどうかわかりません。私は答えようとします。「直径」data.frame の「直径」フィールドに関数を適用し、「ID」フィールドを調整して、対応する直径 2 フィールドに結果を返したいとします。関数がどのように機能するかはわかりませんので、これが機能しない場合はご容赦ください。

選択した分野

直径$直径2[直径$ID=="r1_1"|直径$ID=="r1_3"]<- yourfun(直径$直径[直径$ID=="r1_1"|直径$ID=="r1_3"]

選択されていないフィールド

直径$直径2[直径$ID!="r1_1" & 直径$ID=="r1_3"]<- 直径$直径[直径$ID=="r1_1"|直径$ID=="r1_3"]

于 2013-05-02T16:37:47.090 に答える