4

R を使用して、一意のグループごとに最大値を含む新しい列をデータセットに作成したいと考えています。私のデータは次のようになります。

group<-c("A","A","A","A","A","B","B","C","C","C")
replicate<-c(1,2,3,4,5,1,2,1,2,3)
x<-data.frame(cbind(group,replicate))

以下に示すように、3 番目の列 (各グループの最大値) を作成したいと思います。

group   replicate max.per.group
A       1         5       
A       2         5
A       3         5
A       4         5
A       5         5
B       1         2
B       2         2
C       1         3
C       2         3
C       3         3
4

7 に答える 7

4

x最初に再定義cbindすると (両方の列が因数になります)、

x<-data.frame(group,replicate)

これを使用できます:

merge(x,aggregate(replicate~group,x,FUN=max),all.x=TRUE,by="group")
   group replicate.x replicate.y
1      A           1           5
2      A           2           5
3      A           3           5
4      A           4           5
5      A           5           5
6      B           1           2
7      B           2           2
8      C           1           3
9      C           2           3
10     C           3           3
于 2012-07-26T18:28:19.817 に答える
3

試す

# This is how you create your data.frame
group<-c("A","A","A","A","A","B","B","C","C","C")
replicate<-c(1,2,3,4,5,1,2,1,2,3)
x<-data.frame(group,replicate) # here you don't need c()

# Here's my solution    
Max <- tapply(x$replicate, x$group,max)
data.frame(x, max.per.group=rep(Max, table(x$group)))
 group replicate max.per.group
1      A         1             5
2      A         2             5
3      A         3             5
4      A         4             5
5      A         5             5
6      B         1             2
7      B         2             2
8      C         1             3
9      C         2             3
10     C         3             3
于 2012-07-26T18:24:42.050 に答える
3

他のベースRソリューションは次のとおりです。

cbind(x, cummax=unlist(tapply(x$replicate, x$group, function(x) rep(max(x), length(x)))))
   group replicate cummax
A1     A         1      5
A2     A         2      5
A3     A         3      5
A4     A         4      5
A5     A         5      5
B1     B         1      2
B2     B         2      2
C1     C         1      3
C2     C         2      3
C3     C         3      3
于 2012-07-26T18:26:08.267 に答える
3

共有された再現可能な例は、因子として列があることを示唆しています。最初にそれらを数値に変換する必要があります。

ベース R で試すことができaveます。各グループの最大値を見つけます。

x$max.per.group <- ave(x$replicate, x$group, FUN = function(x) max(as.numeric(x)))

#   group replicate max.per.group
#1      A         1             5
#2      A         2             5
#3      A         3             5
#4      A         4             5
#5      A         5             5
#6      B         1             2
#7      B         2             2
#8      C         1             3
#9      C         2             3
#10     C         3             3

別のオプションdplyr

library(dplyr)
x %>%
   group_by(group) %>%
   mutate(max.per.group = max(as.numeric(replicate)))
于 2017-02-15T05:21:19.163 に答える
2

plyrパッケージを使用できます:

library(plyr)
> ddply(x, .(group), transform, max.per.group=max(replicate))
   group replicate max.per.group
1      A         1             5
2      A         2             5
3      A         3             5
4      A         4             5
5      A         5             5
6      B         1             2
7      B         2             2
8      C         1             3
9      C         2             3
10     C         3             3
> 
于 2012-07-26T18:22:09.127 に答える
1

あなたが使用することができますrle-Run Length Encoding

# Create the data.frame
group <- c("A","A","A","A","A","B","B","C","C","C")
replicate <- c(1,2,3,4,5,1,2,1,2,3)
x <- data.frame(group,replicate)

# using 'rle'
z <- rle(as.numeric(x$group))$lengths
x$max.per.group <- rep(z, z)
x
于 2012-07-26T21:04:09.263 に答える
0

data.table代入 ( ) を使用:=して、コピーせずにその場で列を作成できます

library(data.table)
setDT(x)[, max.per.group := max(replicate), by = group]
x
#     group replicate max.per.group
#1:     A         1             5
#2:     A         2             5
#3:     A         3             5
#4:     A         4             5
#5:     A         5             5
#6:     B         1             2
#7:     B         2             2
#8:     C         1             3
#9:     C         2             3
#10:    C         3             3

データ

x <- data.frame(group,replicate)
于 2017-02-15T05:47:16.433 に答える