用R计算列中值的数量

时间:2014-07-11 00:37:29

标签: r aggregation

我有两个向量:

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)讨论了如何在每个w {1-5}中NA(不计算x)中找到值的数量并为每个y(从1-4)。

让我们按小组分割X:if x<=2,group I; if 2<x<=3,group II;如果3<X<=5,请III组。我需要按组xy的每个值查找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 ... 中找到这些值的平均值。输出应采用以下格式:

{{1}}

2 个答案:

答案 0 :(得分: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的任何整数值来强健y。我似乎无法通过随rbinom随机生成x来打破它,我相信它应该处理{{1}}的任何实数值,因此它应该适用于任何其他向量你可能拥有的那种。

答案 1 :(得分:1)

#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)]

如果您希望NA出现NA时结果为na.rm=TRUE,那么只需从mean(.)移除data[, list(x = mean(x)), by = list(y, x.grp = cut(x, c(-Inf,2,3,5,Inf)))][order(y,x.grp)]

{{1}}