かなりの数の列を持つdata.tableがあります。私はそれらをループし、いくつかの条件を使用して新しい列を作成する必要があります。現在、私は各列ごとに別々の行を書いています。例を挙げて説明しましょう。私たちのようにサンプルデータを見てみましょう -data.tableをループして新しい列を作成する条件があります
合計1から列ごとにset.seed(71)
DT <- data.table(town = rep(c('A','B'), each=10),
tc = rep(c('C','D'), 10),
one = rnorm(20,1,1),
two = rnorm(20,2,1),
three = rnorm(20,3,1),
four = rnorm(20,4,1),
five = rnorm(20,5,2),
six = rnorm(20,6,2),
seven = rnorm(20,7,2),
total = rnorm(20,28,3))
、私は4つの新しい列を作成する必要がある、つまり意味し、SD、UPLIMIT、2シグマ外れ値の計算のためのLowLimitの。私がすることでこれをやっている -
DTnew <- DT[, as.list(unlist(lapply(.SD, function(x) list(mean = mean(x), sd = sd(x), uplimit = mean(x)+1.96*sd(x), lowlimit = mean(x)-1.96*sd(x))))), by = .(town,tc)]
私は、外れ値を思い付くために私DT
今DTmerge <- merge(DT, DTnew, by= c('town','tc'))
と合併しています。このDTnewのdata.tableを、私は、各変数のコードの別個のセットを書いています -
DTAoutlier <- DTmerge[ ,one.Aoutlier := ifelse (one >= one.lowlimit & one <= one.uplimit,0,1)]
DTAoutlier <- DTmerge[ ,two.Aoutlier := ifelse (two >= two.lowlimit & two <= two.uplimit,0,1)]
DTAoutlier <- DTmerge[ ,three.Aoutlier := ifelse (three >= three.lowlimit & three <= three.uplimit,0,1)]
は、いくつかのいずれかの助けには、このコードを簡素化することができますので、
私は外れ値のコードを別々に書く必要はありません。この例では8つの変数しかありませんが、100の変数があれば、100行のコードを書くことになりますか? forループを使ってこれを行うことはできますか?どうやって?
一般的にdata.tableの場合、元の列を保持する新しい列を追加するにはどうすればよいですか。例えば、以下の例では、3列目から10列目のログを取っています。新しいDTlogを作成しないと、DTの元の列が上書きされます。どのように私は元の列をDTに保持し、DTで新しい列を持つことができます。
DTlog <- DT[,(lapply(.SD,log)),by = .(town,tc),.SDcols=3:10]
一部の専門家のアドバイスをお楽しみください。
私はあなたが特に 'data.table'解決策を探している知っているが、あなたが探していることは本質的であることに注意することは、'役に立つかもしれませんdata.table'は 'dplyr'の' mutate_each'に相当します – shreyasgm
@shreyasgm回答を投稿する – eddi
@Prasadこれは何をしているのですか?あなたはなぜ同じグループに同じ4つの数字を繰り返し書いていますか? – eddi