【问题标题】:dynamic subsetting in rr中的动态子集
【发布时间】:2013-10-08 00:04:58
【问题描述】:

我有一个类似于以下的数据集,但包含更多的列和行:

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")

我需要创建一个函数,让我对选定的数据子集的分数求和。但是,每次选择的子集可能有不同数量的变量。一个子集可能是Name=="Fred",另一个可能是Gender == "M"Age == 40。在我的实际数据集中,一个选定的子集中最多可以使用 20 列,因此我需要使其尽可能通用。

我尝试使用包含eval(parse(text=...) 的 sapply 命令,但它只需要 20,000 条左右记录的样本就需要很长时间。我确信有一种更快的方法,如果能找到任何帮助,我将不胜感激。

【问题讨论】:

  • 我想这将取决于您发现过滤器的灵活表示形式,例如list(Gender = "M", Age = 40)?

标签: r subset


【解决方案1】:

有几种方法可以表示这两个变量。一种方式是作为两个不同的对象,另一种方式是作为列表中的两个元素。

但是,使用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)

【讨论】:

    【解决方案2】:
    lapply( subset( df, Gender == "M" & Age == 40, select=Score), sum)
    #$Score
    #[1] 18
    

    我本来可以写的:

    sum( subset( df, Gender == "M" & Age == 40, select=Score) )
    

    但这不能很好地概括。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多