2016-12-15 8 views
2

データフレームからファミリーサイズを計算しようとしています。データフレームには、死亡した家族と家族を離脱した家族の2種類のイベントが含まれています。私は実際の家族のサイズを計算するためにこれらの2つのパラメータを考慮に入れたいと思います。ここ はわずか3人の家族と、私の問題の繁殖例である:私はN =数えることができるデータフレームからのRカウントと減算イベント

family <- factor(rep(c("001","002","003"), c(10,8,15)), levels=c("001","002","003"), labels=c("001","002","003"), ordered=TRUE) 
dead <- c(0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0) 
left <- c(0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0) 
DF <- data.frame(family, dead, left) ; DF 

単にテーブル()

を用いて、第2データフレームDF2内(各家庭での)総家族、
DF2 <- with(DF, data.frame(table(family))) 
colnames(DF2)[2] <- "N" ; DF2 
family N 
1 001 10 
2 002 8 
3 003 15 

しかし、実際に人数を取得する(たとえば、新しい変数N2をDF2に作成する)適切な方法を見つけることができませんでした。死んだり離婚したメンバーの数をNに引いて計算しました。私は、2つのデータフレームDFとDF2をある意味で関連付ける必要があると思います。私はこのサイトの他の関連する質問を探しましたが、正しい答えを見つけることができませんでした... 誰かが良いアイデアを持っているなら、それは素晴らしいでしょう!この合計からsum(dead) + sum(left)を差し引き、各グループII i)において、総#obs):まず、我々はgroup_by(family)にしたいし、その後2つの数字を計算する: は デニ

+0

'library(dplyr); –

答えて

2

ロジック..事前にありがとうございます。 dplyrパッケージで

n()は私たちがdata.tableでは、各グループ

の総#observationsを得ることができます:.N同じ上記の仕事ここで

library(dplyr) 
DF %>% group_by(family) %>% summarise(total = n(), current = n()-sum(dead,left, na.rm = TRUE)) 
# family total current 
# (fctr) (int) (dbl) 
#1 001 10  6 
#2 002  8  4 
#3 003 15  7 


library(data.table) 
# setDT() is preferred if incase your data was a data.frame. else just DF. 
setDT(DF)[, .(total = .N, current = .N - sum(dead, left, na.rm = TRUE)), by = family] 
# family total current 
#1: 001 10  6 
#2: 002  8  4 
#3: 003 15  7 
+1

あなたが提供した両方のソリューションでJoelに感謝します。これは私の大きな一歩です。ありがとう – den

+1

[コードのみの回答]を投稿しないでください(http://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code-only -answers-while-blocking-code-only-ques)これは、彼/彼女の特定の問題を持つOP以外の人には役に立たない。 –

+0

これは上の例でうまくいきましたが、私の実際のデータベース特定の変数の属性(0または1だけではない): "DF%>%group_by(family)%>集計(合計= n()、現在= n() - 合計(デッド== 1) = 1)) "私は次のエラーメッセージを受け取りました:mutate_impl(.data、dots)のエラー: 結果のサイズ(3853)が間違っています。 – den

2

base Rオプション

do.call(data.frame, aggregate(dl~family, transform(DF, dl = dead + left), 
     FUN = function(x) c(total=length(x), current=length(x) - sum(x)))) 
あるん

または変更されたバージョンは

です3210
transform(aggregate(. ~ family, transform(DF, total = 1, 
    current = dead + left)[c(1,4:5)], FUN = sum), current = total - current) 
#  family total current 
#1 001 10  6 
#2 002  8  4 
#3 003 15  7 
0

私は最終的に元のDFテーブルのすべてを計算できるように別のポストからうまく機能する別のものを見つけました。たくさん助けたすべての人に

DF <- ddply(DF,.(family),transform,total=length(family)) DF <- ddply(DF,.(family),transform,actual=length(family)-sum(dead=="1")-sum(left=="1")) DF

ありがとう:これはddply機能を使用しています! Deni

関連する問題