1

次のようなデータセットがありますが、さらに多くの列と行があります。

a<-c("Fred","John","Mindy","Mike","Sally","Fred","Alex","Sam")
b<-c("M","M","F","M","F","M","M","F")
c<-c(40,35,25,50,25,40,35,40)
d<-c(9,7,8,10,10,9,5,8)
df<-data.frame(a,b,c,d)
colnames(df)<-c("Name", "Gender", "Age", "Score")

選択したデータのサブセットのスコアを合計できる関数を作成する必要があります。ただし、選択されたサブセットは、毎回異なる数の変数を持つ場合があります。サブセットの 1 つが&Name=="Fred"である可能性があります。私の実際のデータ セットでは、選択したサブセットで最大 20 列が使用される可能性があるため、これを可能な限り一般化する必要があります。Gender == "M"Age == 40

を含む sapply コマンドを使ってみましたeval(parse(text=...)が、20,000 件程度のレコードのサンプルだけで時間がかかります。もっと速い方法があると確信しており、それを見つける手助けをいただければ幸いです。

4

2 に答える 2

0

これら 2 つの変数を表す方法はいくつかあります。1 つの方法は 2 つの別個のオブジェクトとして、もう 1 つはリスト内の 2 つの要素としてです。

ただし、 a を使用するのnamed listが最も簡単な場合があります。

# df is a function for the F distribution.  Avoid using "df" as a variable name
DF <- df

example1 <- list(Name = c("Fred"))  # c() not needed, used for emphasis
example2 <- list(Gender = c("M"), Age=c(40, 50))

## notice that the key portion is `DF[[nm]] %in% ll[[nm]]`

subByNmList <- function(ll, DF, colsToSum=c("Score")) {
    ret <- vector("list", length(ll))
    names(ret) <- names(ll)
    for (nm in names(ll))
        ret[[nm]] <- colSums(DF[DF[[nm]] %in% ll[[nm]] , colsToSum, drop=FALSE])

    # optional
    if (length(ret) == 1)
        return(unlist(ret, use.names=FALSE))

    return(ret)
   }

subByNmList(example1, DF)
subByNmList(example2, DF)
于 2013-10-08T00:30:38.047 に答える