2017-11-20 5 views
2

に見出さ集計列のR和、Iは、列を作成する必要がある、などnumSpecial:別の列このデータを、最初の4列(行ID、注文、ライン、特別)指定

rowid order line special numSpecial 
1  A  01  X   1 
2  B  01     0 
3  B  02  X   2 
4  B  03  X   2 
5  C  01  X   1 
6  C  02     0 

numSpecial注文ラインが特別なものであれば特別な(値= X)各注文の回数を合計することによって決定されます。それ以外の場合は0です。

私は最初に単に '注文' 'X'、それをorderXと呼びます。

orderX 
AX 
BX 
BX 
BX 
CX 
CX 

はその後orderx順番特別&の合計を実行します。私は、試してみました

numSpecial 
4 
4 
4 
4 
4 
4 

df$numSpecial <- sum(paste(order, special, sep = "") %in% orderx) 

しかし、それdoesntの仕事は、それはすべての注文のためにすべての行の結果の合計を返します。 as.data.tableを使用していますが、期待される結果が得られません:

as.data.table(mydf)[, numSpecial := sum(paste(order, special, sep = "") %in% orderx), by = rowid] 

ただし、これは各行に対して1つだけ戻っています合計ではありません。

numSpecial 
1 
0 
1 
1 
1 
0 

ここで私はこれらに間違っていますか?そのorderX列を作成する必要はないと思いますが、この数を正しく取得する方法はわかりません。これは、簡単に実行できるExcelのcountifに似ています。ベースRを使用して

+0

ライブラリ(dplyr)。 ' – eipi10

+0

もう一つの意味がありますが、私がこれを試してみたときには、上記の私の2つの試みの組み合わせを得た、すなわちnumSpecialは結果として[4,0,4,4,4,0]を持っていた。 –

答えて

1

あなたは(ちょうど1秒で埋め)ダミー変数でaveを使用することができます。私が読ん

df$numSpecial <- ifelse(df$special == "X", ave(rep(1,nrow(df)), df$order, df$special, FUN = length), 0) 

df 
# rowid order line special numSpecial 
#1  1  A 1  X   1 
#2  2  B 1     0 
#3  3  B 2  X   2 
#4  4  B 3  X   2 
#5  5  C 1  X   1 
#6  6  C 2     0 

注意numSpecial列のないデータで

+0

ニース!ave()を使って見るのではなく、1で満たしていて、うまくいきました。私の完全なデータセットを使って安全性を確認することになります。 –

0

もう一つのオプションは、集計を使用することです:

# Your data 
df <- data.frame(rowid = 1:6, order = c("A", "B", "B", "B", "C", "C"), special = c("X", "", "X", "X", "X", "")) 

# Make the counts  
dat <- with(df,aggregate(x=list(answer=special),by=list(order=order,special=special),FUN=function(x) sum(x=="X"))) 

# Merge back to original dataset: 
dat.fin <- merge(df,dat,by=c('order','special')) 
2

あり、いくつかの方法は、おそらくですが、あなただけ"X"のTRUE/FALSEフラグが存在していることによってそれを乗算できます

dat[, numSpecial := sum(special == "X") * (special == "X"), by=order] 
dat 

# rowid order line special numSpecial 
#1:  1  A 1  X   1 
#2:  2  B 1     0 
#3:  3  B 2  X   2 
#4:  4  B 3  X   2 
#5:  5  C 1  X   1 
#6:  6  C 2     0 

あなたはまた少し違ったようにそれを行うことができます:

dat[, numSpecial := 0L][special == "X", numSpecial := .N, by=order] 

datは:

library(data.table) 
dat <- structure(list(rowid = 1:6, order = c("A", "B", "B", "B", "C", 
"C"), line = c(1L, 1L, 2L, 3L, 1L, 2L), special = c("X", "", 
"X", "X", "X", "")), .Names = c("rowid", "order", "line", "special" 
), row.names = c(NA, -6L), class = "data.frame") 
setDT(dat) 
+0

これらを試してみると0の値をすべて取得しています。 –

+0

@KJackson - ここで動作することを確認できます。私はコードが機能していることを示すために私の例を完全に再現可能にしました(最後に編集を見てください)。 – thelatemail

+0

今、働いてくれてありがとう。残念ながら1つの答えしか受け入れられません。他の方法を探している人にとっては良い例です。 –

1

dplyrパッケージ:

library(dplyr) 

df %>% group_by(order) %>% 
    mutate(numSpecial = ifelse(special=="X", sum(special=="X"), 0)) 
rowid order special numSpecial 
1  1  A  X   1 
2  2  B     0 
3  3  B  X   2 
4  4  B  X   2 
5  5  C  X   1 
6  6  C     0 
+0

私の実際のデータを使って、あなたが見せた結果は得られません。それは上記の私の試みのコンパイルを返し、結果を合計し、それぞれ== "X"という特殊な値で設定します。 numSpecial [4,0,4,4,4,0]。 –

+0

あなたが提供したサンプルデータとクリーンなRセッションでコードを実行して、結果が変わらないかどうか教えてください。 – eipi10

+0

今、感謝しています。残念ながら1つの答えしか受け入れられません。私はここでdplyrの使用が好きです! –

関連する問題