在R中子集字符数据

时间:2014-11-03 23:09:55

标签: r

我有一个包含多列不同字符数据的数据框。我想找到该字符数据的每个组合的平均值。我想我正在接近一个解决方案,但我很难弄清楚如何循环字符。一些示例数据如下:

Var1    Var2    Var3    M1
a       w       j       20
a       w       j       15
a       w       k       10
a       w       j       0
b       x       L       30
b       x       L       10
b       y       k       20
b       y       k       15
c       z       j       20
c       z       j       10
c       z       k       11
c       w       l       45
a       d       j       20
a       d       k       4
a       d       l       23
a       d       k       11

试图以下列形式得到它:

P1  P2  P3  Avg
a   w   j   11.667
a   w   k   10
a   d   j   20
a   d   k   15
a   d   l   23
b   x   L   20
b   y   k   17.5
c   z   j   15
c   z   k   11
c   w   l   45

我认为这个想法是这样的:

test <- read.table("clipboard",header=T)

newdata <- subset(test, 
                  Var1=='a' 
                  & Var2=='w'
                  & Var3=='j',
                  select=M1
                  )
row.names(newdata)<-NULL



newdata2 <- as.data.frame(matrix(data=NA,nrow=3,ncol=4))
names(newdata2) <- c("P1","P2","P3","Avg")

newdata2[1,1] <- 'a'
newdata2[1,2] <- 'w'
newdata2[1,3] <- 'j'
newdata2[1,4] <- mean(newdata$M1)

哪个适用于第一行,但我不完全确定如何自动执行此操作以遍历列中的每个字符组合。当然,除非在这种情况下使用类似的类似应用函数吗?

2 个答案:

答案 0 :(得分:3)

library(dplyr)
newdata2 = summarise(group_by(test,Var1,Var2,Var3),Avg=mean(M1))

结果:

> newdata2
Source: local data frame [10 x 4]
Groups: Var1, Var2

   Var1 Var2 Var3      Avg
1     a    d    j 20.00000
2     a    d    k  7.50000
3     a    d    l 23.00000
4     a    w    j 11.66667
5     a    w    k 10.00000
6     b    x    L 20.00000
7     b    y    k 17.50000
8     c    w    l 45.00000
9     c    z    j 15.00000
10    c    z    k 11.00000

答案 1 :(得分:1)

使用基本聚合函数:

mydata <- read.table(header=TRUE, text="
                     Var1    Var2    Var3    M1
a       w       j       20
a       w       j       15
a       w       k       10
a       w       j       0
b       x       L       30
b       x       L       10
b       y       k       20
b       y       k       15
c       z       j       20
c       z       j       10
c       z       k       11
c       w       l       45
a       d       j       20
a       d       k       4
a       d       l       23
a       d       k       11")

aggdata <-aggregate(mydata$M1, by=list(mydata$Var1,mydata$Var2,mydata$Var3) , FUN=mean, na.rm=TRUE)

输出:

> aggdata
   Group.1 Group.2 Group.3        x
1        a       d       j 20.00000
2        a       w       j 11.66667
3        c       z       j 15.00000
4        a       d       k  7.50000
5        a       w       k 10.00000
6        b       y       k 17.50000
7        c       z       k 11.00000
8        a       d       l 23.00000
9        c       w       l 45.00000
10       b       x       L 20.00000