データベース内のベクトルを作成する関数を定義すると、各行に対してその関数がそのデータベース内の別の列を参照し、指定された新しいサブセットの別の列を合計し、その値を元のデータベースの新しい列の対応する行に戻します。ユーザ定義関数Rのサブセットを作成して合計するR
つまり、私はこのような何かに見えるデータフレーム持っている:私は、新たなデータフレームを作成したいと考え
ID <- c('a', 'b', 'c', 'd', 'e')
M <- 20:39
df <- data.frame(cbind(ID, M))
df$M <- as.numeric(df$M)
> df
ID M
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 a 6
7 b 7
8 c 8
9 d 9
10 e 10
11 a 11
12 b 12
13 c 13
14 d 14
15 e 15
16 a 16
17 b 17
18 c 18
19 d 19
20 e 20
> str(df)
'data.frame': 20 obs. of 2 variables:
$ ID: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 1 2 3 4 5 ...
$ M : num 1 2 3 4 5 6 7 8 9 10 ...
を、Z
、このようZ <- data.frame(cbind(X, Y))
その:
X <- as.character(unique(df$ID))
> X
[1] "a" "b" "c" "d" "e"
Y
は、すべてのaの和、すべてのbの合計、すべてのcの和などのベクトルです。
したがって、Y
sh c(34, 38, 42, 46, 50)
に等しくなるとウルド私の最終的な結果は次のようになります。
> Z
X Y
1 a 34
2 b 38
3 c 42
4 d 46
5 e 50
> str(Z)
'data.frame': 5 obs. of 2 variables:
$ X: chr "a" "b" "c" "d" ...
$ Y: num 34 38 42 46 50
はこれを行うために、私は最初のデータフレームにX
を回してみた(データテーブルとしてで動作するように簡単です?):
> Z <- data.frame(X)
> Z
X
1 a
2 b
3 c
4 d
5 e
> str(Z)
'data.frame': 5 obs. of 1 variable:
$ X: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
、その後Z$Y <- sum(df[df$ID == Z$X, 2])
としてY
を定義するが、私は一意の値を取得していない:私も試した
> Z
X Y
1 a 210
2 b 210
3 c 210
4 d 210
5 e 210
は機能を定義します
f1 <- function(v, w, x, y, z){sum(v[v$w == x$y, z])}
それが私を取得します:
> f1(df, 'ID', Z, 'X', 'M')
[1] 0
私は似た何かを、このフォーラムで別のポストから関数を発見した:
f1 <- function(df, cols, match_with, to_x = 50){
df[cols] <- lapply(df[cols], function(i)
ifelse(grepl(to_x, match_with, fixed = TRUE), 'MID',
i))
return(df)
}
これは探しますので、同様match_with
列に値「50」を格納し、cols
で指定される列のその行に値「MID」を戻します。両方の列が同じ指定データ・ベースe df
。したがって、to_x = 50
を、固定値 "50"を探す代わりに、列Z$X
にある値を探し、固定値 "MID"を返す代わりに、値の合計を返すようなものに置き換える必要がありますdf[df$ID == Z$X, df$M]
。
f1 <- function(df, cols, match_with, to_x = df[ , 1], x){
df[cols] <- lapply(df[cols], function(i)
ifelse(grepl(to_x, match_with, fixed = TRUE), sum(x),
i))
return(df)
}
しかし、これまでのところ、私のバリエーションのどれも望ましい結果を生じなかった:私は、次のバリエーションを書き込むことによって、これらの変更を自分でしようとしました。この1は私を与えた:
> f1(Z, df, cols = c('Y'), match_with = df$ID, x = df$M)
X Y
1 a 210
2 b 210
3 c 210
4 d 210
5 e 210
Warning messages:
1: In grepl(to_x, match_with, fixed = TRUE) :
argument 'pattern' has length > 1 and only the first element will be used
2: In `[<-.data.frame`(`*tmp*`, cols, value = list(Y = c(210, 210, :
replacement element 1 has 20 rows to replace 5 rows
それは代わりにdf$ID == Z$X
サブセットのdf$M
の全体を合計しているようです。他のバリエーションでは、第2のデータフレームの列を参照する際に問題があるようです。
私は多少Rに慣れていて、ユーザー定義関数を書く経験はほとんどありません(おそらくこの質問で分かります)。どんな助けも非常に高く評価されるでしょう!