【问题标题】:Conditional calculating the numbers of values in column with R有条件地用 R 计算列中的值的数量
【发布时间】:2014-09-02 01:31:35
【问题描述】:

我有两个向量:

x <- c(1,1,1,1,1, 2,2,2,3,3,  3,3,3,4,4,  5,5,5,5,5 )
y <- c(2,2,1,3,2, 1,4,2,2,NA, 3,3,3,4,NA, 1,4,4,2,NA)

这个问题 (Conditional calculating the numbers of values in column with R, part2) 讨论了如何为每个 x(从 1 到 5)和每个 y(从1-4)。

让我们按组拆分X:如果x&lt;=2,则组I;如果2&lt;x&lt;=3,组II;如果3&lt;X&lt;=5,则分组III。我需要按组和y 的每个值查找x 中不同值的数量。我还需要在同一组中找到x 中这些值的平均值。输出应采用以下格式:

y x    Result 1 (the number of distinct numbers in X); Result 2 (the mean)
1 I     ...
1 II    ...
1 III   ...     
...
4 I     ...
4 II    ...
4 III   ...

【问题讨论】:

    标签: r aggregation


    【解决方案1】:

    我对 R 代码的掌握不是很好,所以这里是一个相当丑陋的函数:

    ARUF=function(x,y){df1=data.frame(x,y,group=NA);miny=min(y,na.rm=T)
    maxy=max(y,na.rm=T);for(i in 1:length(df1$x))df1$group[i]=if(df1$x[i]<=2)'I'else
    if(df1$x[i]>2&df1$x[i]<=3)'II'else if(df1$x[i]>3&df1$x[i]<=5)'III'else'NA'
    Result1=c();Result2=c();for(i in miny:maxy){for(j in c('I','II','III')){
    Result1=append(Result1,length(levels(factor(subset(df1,y==i&group==j)$x))))
    Result2=append(Result2,mean(subset(df1,y==i&group==j)$x))}}
    print(data.frame(y=rep(miny:maxy,rep(3,maxy+abs(miny-1))),
    x=rep(c('I','II','III'),maxy+abs(miny-1)),Result1,Result2),row.names=F)}
    

    使用您的xyARUF(x,y) 打印此data.frame

    y   x Result1  Result2
    1   I       2 1.500000
    1  II       0      NaN
    1 III       1 5.000000
    2   I       2 1.250000
    2  II       1 3.000000
    2 III       1 5.000000
    3   I       1 1.000000
    3  II       1 3.000000
    3 III       0      NaN
    4   I       1 2.000000
    4  II       0      NaN
    4 III       2 4.666667
    

    我不遗余力地使ARUF 具有y 的任何整数值的稳健性。我似乎无法通过使用rbinom 随机生成y 来打破它,我相信它应该处理x 的任何实数值,因此它应该适用于您可能拥有的任何其他同类向量.

    【讨论】:

      【解决方案2】:
      #Bring in data.table library
      require(data.table)
      data <- data.table(x,y)
      
      #Summarize data
      data[, list(x = mean(x, na.rm=TRUE)), by = 
             list(y, x.grp = cut(x, c(-Inf,2,3,5,Inf)))][order(y,x.grp)]
      

      如果您希望在存在NAs 时结果为NA,则只需从mean(.) 中删除na.rm=TRUE

      data[, list(x = mean(x)), by = 
             list(y, x.grp = cut(x, c(-Inf,2,3,5,Inf)))][order(y,x.grp)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        相关资源
        最近更新 更多