我有数据,我想计算一些统计数据。 数据的组织方式使得我有一个对应于每个3元素元组的值 像
这样的东西(P1,M1,R1,V1)
(P1,M1,R2,V2)
(P1,M2,R1,V1)
...
此处P1,M1和R1不是数字,而是V1和V2。 现在我将数据放在csv文件中,x2.cvs如下:
P,M,R,V
P1,M1,R1,V1
P1,M1,R2,V2
...
我使用
读取数据d = read.table("x2.csv", sep=",", header=TRUE)
但之后我不知道如何处理数据。
我想从计算简单信息开始: P的每个元素的平均值是多少(因此平均值将超过所有元素 M和R),或{P,M}的每对元素(因此这里的平均值将超过R的元素。
接下来我想做一些更复杂的事情,比如计算P1的元素数量是否超过某个指定值。
答案 0 :(得分:6)
这是一个开始,有data.table
,plyr
和基本功能,还有很多其他方法......
首先,一些示例数据......
dput(examp)
structure(list(P = structure(c(1L, 1L, 1L, 2L), .Label = c("P1",
"P2"), class = "factor"), M = structure(c(1L, 1L, 2L, 2L), .Label = c("M1",
"M2"), class = "factor"), R = structure(c(1L, 2L, 1L, 1L), .Label = c("R1",
"R2"), class = "factor"), V = c(23, 49, 24, 29)), .Names = c("P",
"M", "R", "V"), row.names = c(NA, -4L), class = "data.frame")
#
# to give something like what you have...
#
examp
P M R V
1 P1 M1 R1 23
2 P1 M1 R2 49
3 P1 M2 R1 24
4 P2 M2 R1 29
以下是使用data.table
的一种方法。如果您的数据对象非常大,您会发现data.table
包非常快,文档也很出色:http://datatable.r-forge.r-project.org/datatable-intro.pdf
# What is the average of each element of P?
library(data.table)
examp.dt <- data.table(examp)
setkey(examp.dt,P)
examp.dt[,mean(V),by=P]
P V1
[1,] P1 32
[2,] P2 29
#
另一个使用plyr
# What is the average of each element of P?
library(plyr)
ddply(examp, "P", function(df)mean(df$V))
P V1
1 P1 32
2 P2 29
另一个使用基础R
# What is the average of each element of P?
# for example using the by() function, tapply() would be similar
with(examp, by(examp, P, mean))
P: P1
P M R V
NA NA NA 32
-------------------------------------------------
P: P2
P M R V
NA NA NA 29
#
# What is the average of each element of R?
with(examp, by(examp, R, mean))
R: R1
P M R V
NA NA NA 25.33333
----------------------------------------------
R: R2
P M R V
NA NA NA 49
#
# the same, using tapply
with(examp, tapply(V, R, mean)
R1 R2
25.33333 49.00000
对于您的上一个问题,P1的元素数量多于某个指定值,我们可以像subset
那样使用:
# how many elements of P1 are greater than 20?
nrow(subset(examp, examp$P=="P1" & examp$V>20))
[1] 3
或者甚至仅[
获得相同结果且输入较少的内容:
nrow(examp[examp$P=="P1" & examp$V>20,])
[1] 3
答案 1 :(得分:5)
aggregate
函数可能是您最容易使用的函数:
1) P 的每个元素的平均值是多少?
aggregate(formula = V ~ P, data = d, FUN = mean)
2)或{P,M} 的每对元素?
aggregate(formula = V ~ M + R, data = d, FUN = mean)
3) P1的元素数量多于某个指定值?
aggregate(formula = V ~ P, data = d, FUN = function(x)sum(x > 10))