1

次のデータフレームがあります。

df<-structure(list(totprivland = c(175L, 50L, 100L, 14L, 4L, 240L, 
10L, 20L, 20L, 58L), ncushr8d1 = c(0L, 0L, 0L, 0L, 0L, 30L, 5L, 
0L, 0L, 50L), ncu_CENREG1 = structure(c(4L, 4L, 4L, 4L, 1L, 3L, 
3L, 3L, 4L, 4L), .Label = c("Northeast", "Midwest", "South", 
"West"), class = "factor"), ncushr8d2 = c(75L, 50L, 100L, 14L, 
2L, 30L, 5L, 20L, 20L, 8L), ncu_CENREG2 = structure(c(4L, 4L, 
4L, 4L, 1L, 2L, 1L, 4L, 3L, 4L), .Label = c("Northeast", "Midwest", 
"South", "West"), class = "factor"), ncushr8d3 = c(100L, NA, 
NA, NA, 2L, 180L, 0L, NA, NA, NA), ncu_CENREG3 = structure(c(4L, 
NA, NA, NA, 1L, 1L, 3L, NA, NA, NA), .Label = c("Northeast", 
"Midwest", "South", "West"), class = "factor"), ncushr8d4 = c(NA, 
NA, NA, NA, 0L, NA, NA, NA, NA, NA), ncu_CENREG4 = structure(c(NA, 
NA, NA, NA, 1L, NA, NA, NA, NA, NA), .Label = c("Northeast", 
"Midwest", "South", "West"), class = "factor")), .Names = c("totprivland", 
"ncushr8d1", "ncu_CENREG1", "ncushr8d2", "ncu_CENREG2", "ncushr8d3", 
"ncu_CENREG3", "ncushr8d4", "ncu_CENREG4"), row.names = c(27404L, 
27525L, 27576L, 27822L, 28099L, 28238L, 28306L, 28312L, 28348L, 
28379L), class = "data.frame")

=======

dput次の基本的な考え方は次のとおりです。

Total    VariableA  LocationA    VariableB     LocationB
30            20       East          10         East
20            20       South         NA         West
115           15       East         100         South
100           50       West          50         West 
35            10       East          25         South  

合計 (dput の例では totprivland) は変数 (ncushr8d1、ncushr8d2、ncushr8d3、および ncushr8d4) の合計であり、各変数には対応する因子位置変数 (ncu_CENREG1 など) があります。この同じパターンには、さらに 6 つの変数と場所があります。多くの場合、位置変数は、複数の数値変数に対して同じ値になります (たとえば、例の最初の行のように複数の「東」位置値)。

共通の位置係数によって各行の値の合計を取得し、各位置の合計に対して新しい列を作成したいと思います。NA 値を無視する機能を使用すると、次のようになります。

Total    VariableA  LocationA    VariableB     LocationB   TotalWest  TotalEast TotalSouth
30            20       East          10         East          0          30          0
20            20       South         NA         NA            0           0         20
115           15       East         100         South         0          15        100
100           50       West          50         West        100           0          0 
35            10       East          25         South         0          10         25

集計と分割を調べましたが、それらを非常に多くの列で機能させる方法がわかりません。また、8 つの変数すべてとそれに対応する場所をローテーションする長い "if" ステートメントも考えていますが、これにはもっと良い解決策が必要だと感じています。観測は調査パッケージで使用するために重み付けされています。後で再結合することはできますが、観測を複製して reshape パッケージで「長く」することは避けたいと思います。どんな提案でも大歓迎です!

どうもありがとう、ルーク

4

1 に答える 1

0

まず、データ フレームを、値、場所、ケースの 3 つの列を持つ長い形式に変換します。case は、データがどのケース (行など) から来たかを示す必要があります。順序は関係ありません。したがって、データフレームは次のようになります。

Value    Loc    Case
20       East   1
20       South  2
...
10       East   1

など...これを行う1つの方法は、値と場所を積み重ねてから、手動で(そして簡単に)ケース番号を追加することです. 元のデータフレームが df と呼ばれ、列 2,4 に値があり、列 3,5 に位置があるとします。

v.col = stack(df[,c(2,4)])[,1]
v.loc = stack(df[,c(3,5)])[,1]
v.case = rep(1:nrow(df),2)
long.data = data.frame(v.col,v.loc,v.case)    # this is not actually needed, but just so you can view it

tapply を使用して、必要な列を作成します

s = tapply(v.col,list(v.case,v.loc),sum,na.rm=T)
new.df = cbind(df,s)

おそらく NA を 0 か何かに調整する必要がありますが、これは簡単なはずです。

おそらく plyr/reshape パッケージを使用してこれを行う簡単な方法もありますが、私はこれらの専門家ではありません。

お役に立てれば

于 2013-06-25T10:07:00.680 に答える