2017-11-17 11 views
-1

データベース内のベクトルを作成する関数を定義すると、各行に対してその関数がそのデータベース内の別の列を参照し、指定された新しいサブセットの別の列を合計し、その値を元のデータベースの新しい列の対応する行に戻します。ユーザ定義関数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に慣れていて、ユーザー定義関数を書く経験はほとんどありません(おそらくこの質問で分かります)。どんな助けも非常に高く評価されるでしょう!

答えて

0

私はそれを持っていると思います。

> f1 <- function(col1, col2, df2, to_add){ 
+ lapply(col1, function(i){ 
+ df2$x <- grepl(i, col2, fixed = TRUE) 
+ df3 <- df2[df2$x == TRUE, to_add] 
+ sum(df3, na.rm = TRUE) 
+ })} 
> Z$Y <- f1(Z$X, df$ID, df, c('M')) 
> Z 
    X Y 
1 a 34 
2 b 38 
3 c 42 
4 d 46 
5 e 50 
関連する問題