2017-06-03 4 views
0

複数の条件を考慮して値を合計することで新しい変数を作成したいと考えています(以下を参照してください)。ここで私の現在の問題のようなものまでRコードを見ることができます。条件付き加算による新しいデータフレーム列の記入方法

# The raw dataframe 
area <- c("A", "A", "B", "A", "C", "B", "A", "B", "A", "C") 
varclass <- c("Z1", "Z1", "Z1", "Z2", "Z1", "Z1", "Z2", "Z1", "Z2", "Z2") 
count <- c(45, 56, 2, 8, 345, 3, 98, 2, 6, 9) 

df1 <- data.frame(area, 
        varclass, 
        count, 
        stringsAsFactors = FALSE) 
df1 
# See how df1 looks like... 
# area varclass count 
#1  A  Z1 45 
#2  A  Z1 56 
#3  B  Z1  2 
#4  A  Z2  8 
#5  C  Z1 345 
#6  B  Z1  3 
#7  A  Z2 98 
#8  B  Z1  2 
#9  A  Z2  6 
#10 C  Z2  9 

# Building the final dataframe 

df2 <- data.frame(unique(df1$area), 
        stringsAsFactors = FALSE) 
names(df2)[1] <- "area" 
# See how df2 looks like... 
# area 
#1 A 
#2 B 
#3 C 

# The new variable to build 

df2$Z1_sum <- sum(df1[df1$varclass == "Z1" & df1$area == df2$area,]$count) 
# doesn't work 

# See what I hope 
# area Z1_sum 
#1 A  101 
#2 B  7 
#3 C  345 

最後の行からわかるように、私は新しい変数Z1_sumをdf2データベースに構築したいと思います。 Z1_sumはvarclass = "Z1"df1$areaの値がdf2$areaの現在の行(MS ExcelではLC1または$ A2セルIDを使用していることを意味します)の値を満たすdf1データベースからのカウントの合計です。

私はdf1をdf1からdf2を直接構築する方法や、dcast関数を使って解決策を探しているわけではないことを考慮してください...私は正しい値を返すことができる式がほしいです私の新しいコラムそれは私の余分な条件です。どうして?なぜなら、私は次に他の変数を単なる合計よりも洗練された式で構築するからです。このような条件付き操作をどのように行うかを理解することによって、私は次のステップに進むことができます。

ありがとうございました。

ジェフ

答えて

0

あなたが意味するか:あなたのコメントに対処するための

df2 <- setNames(
       aggregate(
          count ~ area, 
          df1[df1$varclass == "Z1", ], 
          sum 
         ), 
       c("area", "Z1_sum") 
       ) 
df2 
    area Z1_sum 
1 A 101 
2 B  7 
3 C 345 

または

df2$Z1_sum <- aggregate(count ~ area, df1[df1$varclass == "Z1", ], sum)$count 

編集を。 「長い」形式で、あなたのデータを与える

df2 <- aggregate(
       count ~ area + varclass, 
       df1, 
       sum 
       ) 

で試してみてください

df2 
    area varclass count 
1 A  Z1 101 
2 B  Z1  7 
3 C  Z1 345 
4 A  Z2 112 
5 C  Z2  9 

今、あなたのようなものを使用して「ワイド」形式に再構築する必要があります:

df2 <- xtabs(count ~ area + varclass, df2) 
    varclass 
area Z1 Z2 
    A 101 112 
    B 7 0 
    C 345 9 

か:

df2 <- reshape(df2, idvar = "area", timevar = "varclass", direction = "wide") 
    area count.Z1 count.Z2 
1 A  101  112 
2 B  7  NA 
3 C  345  9 
+0

ありがとうございます。最初の提案はうまくいくが、ローマのものと同じ制限がある。あなたの2番目のものは私には正確に見えますが、私のデータセットでは動作しません。エラーメッセージ "$ < - 。data.frame'(' * tmp * '、AZ_tx、value = c(96L、24L、84L、12L、:置換は105行、データは322です。 –

+0

それは本当です。それを克服することは可能でしょうか?他のアイデア?私は最初、 "&df1 $ area == ??"のような引数を追加することを考えました。どこ?出力行を考慮してdf2 $領域の相対値を与える... –

+0

あなたの編集のために多くのありがとう。それは非常にうれしいです。しかし、私は最終的に新しい列をより洗練された操作で満たすために、データフレームを再形成/変更することは望ましくありません。 Z1_sumをZ2_sumで除算し、100を掛けた結果を使って、1つのステップ "newvar2"で作成したいと認めている... –

0

最終集計に含めたいZ *に基づいてサブセットを作成します。

df1Z1 <- df1[df1$varclass %in% c("Z1"), ] 
aggregate(count ~ area, data = df1Z1, FUN = sum) 

    area count 
1 A 101 
2 B  7 
3 C 345 
+0

ありがとうございました。 1回のショットでうまくいくが、データフレームdf2に複数の新しい列を埋め込む方法がわからない。 Z1_sumが多くの新しい列(Z2_sumなど)の1つで、df2データフレームを埋めたいと思っています。機能が不規則であるため、多くの中間データフレームを作成し、後ですべてを1つにマージする必要があります。私はそれについて間違っていますか? –

0

あなたはdplyrを使用して、目的の結果を得ることができます。

library(dplyr) 

df2 <- group_by(df1, area) %>% 
    filter(varclass == "Z1") %>% 
    summarize(Z1_sum = sum(count)) %>% 
df2 
#> # A tibble: 3 x 2 
#> area Z1_sum 
#> <chr> <dbl> 
#> 1  A 101 
#> 2  B  7 
#> 3  C 345 

dplyr動詞はかなり説明すべきであり、%>%はパイプは、動作する1つの関数から出力を取り出すと、それは最初に作っています次への入力。 group_byここでは列単位でareaをグループ化していますので、合計を計算すると(summarize)、各領域グループの合計です。 filterはデータをサブセット化します。

+0

ありがとうございます。パッケージdplyr素晴らしいです! –

関連する問題