私は18枚のデータフレームのリストに、このような構造を通じて行とランダムな空白行の数が異なる各1、持っている:選択行
l = c("D1", "D1", "D1", "", "D1", "D1", "D1", "D2", "D2", "D2", "D2", "", "D3", "D3", "D3", "D3")
a = c("Al", "Al", "St", "", "St", "Un", "St", "Al", "Al", "St", "St", "", "Al", "Al", "St", "St")
b = c(6000, 4980, 123, "", 98, 87, 51, 10989, 8756, 457, 233, "", 989, 743, 67, 55)
mydf = data.frame("Location" = l, "Name" = a, "count" = b)
mydf
Location Name count
1 D1 Al 6000
2 D1 Al 4980
3 D1 St 123
4
5 D1 St 98
6 D1 Un 87
7 D1 St 51
8 D2 Al 10989
9 D2 Al 8756
10 D2 St 457
11 D2 St 233
12
13 D3 Al 989
14 D3 Al 743
15 D3 St 67
16 D3 St 55
を
18個のデータフレームとマイデータ:
sapply(mydata, dim)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,] 171 146 132 147 149 148 138 143 114 111 115 101 112 218 122 96 156 128
[2,] 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
私は、Alの合計が場所ごとにカウントして私のデータフレームに列を追加するtransform
を使用したいです。新しい列全体を同じ値で埋めることを計画しています。文字列 "Al"を含む行を見つけてからsum関数を適用できると思っていましたが、これは動作しません。ここに私が使用しようとしているコードはあります:
add.al.sum = function(df){
als = df[grep("Al", df$Name),]
alsum = sum(als, na.rm = TRUE)
transform(df, Al.sum = c(alsum))
}
mydf = lapply(mydf, function(x) add.al.sum(x))
これは私がしたいことをしません。変換されたデータテーブルをこのようにしたい。 空白行を保持する必要はありません。
Location Name count Al.sum
1 D1 Al 6000 10980
2 D1 Al 4980 10980
3 D1 St 123 10980
4 NA
5 D1 St 98 10980
6 D1 Un 87 10980
7 D1 St 51 10980
8 D2 Al 10989 19745
9 D2 Al 8756 19745
10 D2 St 457 19745
11 D2 St 233 19745
12 NA
13 D3 Al 989 1732
14 D3 Al 743 1732
15 D3 St 67 1732
16 D3 St 55 1732
実際にはError in df$Name : $ operator is invalid for atomic vectors
と表示されます。私の実際のデータと私のサンプルデータとの唯一の違いは、私の実際のデータのcount
列がnum
の代わりにint
と表示されていることです。 count
列のint
の値を使用するには、この値が必要です。
私がAlカウントの合計を得た後、StとUnカウントの合計をそれぞれの列で得るプロセスを繰り返します。
EDIT:サンプルデータを展開し、私が作業しているデータフレームのリストについてもう少し詳しい情報を追加しました。
私は別のパッケージを必要としないというあなたのアプローチが好きです。私は私の例のデータに示していない1つの問題があると思います。私のデータには空白の行があります。したがって、mydf = transform(mydf、Al.sum = ave((Name == "Al")* count、Location、FUN = function(x)sum(x、na.rm = TRUE))) 'Iこのエラーメッセージが表示されます。(関数(...、row.names = NULL、check.rows = FALSE、check.names = TRUE、: の引数は行数が異なることを意味します:171,146,132,147,149 、148,138,143,114,111,115,101,112,218,122,96,156,128 '空行をスキップする方法を教えてください。 – aminards
上記のエラーメッセージが関連していることがわかります私のリスト内の各データフレームの行数が異なっていることを確認するにはどうすればよいですか? – aminards
質問を編集しました。 – aminards