私の仕事は、指定された変数(byvar
)のレベルによって与えられたデータセット(dset
)の与えられた変数(vars
)の対数を計算することを目的とした関数を書くことです。所与のレベルの与えられた変数の最小値がbyvar
であれば、単純な自然対数が計算されます。所与のセグメントは次のように計算されるため、さもなければ、与えられた変数の新しい値がこれを達成するためにログ変換のループ
new.value = log(old.value + 1 + abs(min.value.of.given.var.for.given.level)
、Iは、(再現例えば)そのようなコードを書いた:
set.seed(1234567)
data(iris)
iris$random <- rnorm(nrow(iris), 0, 1)
log.vars <- function(dset, vars, byvar, verbose = F){
# a loop by levels of "byvar"
for(i in 1:length(unique(dset[[byvar]]))){
if(verbose == T){
print(paste0("------ level=", unique(dset[[byvar]])[i], "----"))
}
# a loop by variables in "vars"
for(j in 1:length(vars)){
min.var <- min(dset[[vars[j]]][dset[[byvar]] == unique(dset[[byvar]])[i]])
# if minimum of a given variable for a given level is greater than 0 then
# calculate its logarithm;
# otherwise, add to its value 1 and the mode of its minimum and calculate
# its logarithm
dset[[paste0("ln_", vars[j])]][dset[[byvar]] == unique(dset[[byvar]])[i]] <-
if(min.var > 0){
log(dset[[vars[j]]][dset[[byvar]] == unique(dset[[byvar]])[i]])
} else{
log(dset[[vars[j]]][dset[[byvar]] == unique(dset[[byvar]])[i]] + 1 +
abs(min.var))
}
}
}
return(dset)
}
iris2 <- log.vars(dset = iris,
vars = c("Sepal.Length", "random", "Sepal.Width"),
byvar = "Species",
verbose = T)
head(iris2)
それは動作しますしかし、読みやすさには明らかな問題があります。さらに、その性能が向上するかどうかは疑問です。最後に重要なのは、データセット内の観測の順序を保持することです。ヘルプ/提案の任意の種類の答えに私のコメントを回す
これはうまくいくもので、読みやすさとパフォーマンスの向上が求められていますが、これは実際は姉妹サイトのCodeReview SEにとってより適切な質問です。 –