我有一个像这样的数据框:
df <- structure(list(year = c(1990, 1990, 1990, 1990, 1990, 1990, 1990,
1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1991, 1991, 1991,
1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
1991), group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"),
value = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L,
13L, 14L, 15L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L,
15L, 16L, 17L, 18L, 19L)), .Names = c("year", "group", "value"
), row.names = c(NA, -30L), class = "data.frame")
> df
year group value
1 1990 A 1
2 1990 A 2
3 1990 A 3
4 1990 A 4
5 1990 A 5
6 1990 A 6
7 1990 B 7
8 1990 B 8
9 1990 B 9
10 1990 B 10
11 1990 B 11
12 1990 B 12
13 1990 B 13
14 1990 B 14
15 1990 B 15
16 1991 A 5
17 1991 A 6
18 1991 A 7
19 1991 A 8
20 1991 A 9
21 1991 A 10
22 1991 A 11
23 1991 A 12
24 1991 A 13
25 1991 A 14
26 1991 B 15
27 1991 B 16
28 1991 B 17
29 1991 B 18
30 1991 B 19
我需要为每年应用一个函数(我打算用plyr
和summarise
),但仅在因子级别上使用最多的行(A或B)。有没有办法自动选择每年的这个级别(A或B)?
df2 <- ddply(df, .(year), summarise, result="some operation on longest level"))
期望的输出:
> df2
year group value result
1 1990 B 7 5
2 1990 B 8 4
3 1990 B 9 5
4 1990 B 10 3
5 1990 B 11 3
6 1990 B 12 8
7 1990 B 13 11
8 1990 B 14 7
9 1990 B 15 2
10 1991 A 5 10
11 1991 A 6 13
12 1991 A 7 9
13 1991 A 8 7
14 1991 A 9 6
15 1991 A 10 1
16 1991 A 11 15
17 1991 A 12 5
18 1991 A 13 5
19 1991 A 14 2
答案 0 :(得分:3)
这可能是dplyr
library(dplyr)
df <- df %.% group_by(year,group) %.% mutate(count = n()) %.% ungroup()
df <- df %.% group_by(year) %.% filter(count %in% max(count)) %.% mutate(result = sqrt(value))
df$count <- NULL
因为我不确定您要将哪个功能应用于result
我在@ rbatt的回答中使用了sqrt(value)
答案 1 :(得分:1)
对不起,我自己不使用plyr,但这是我用基本功能做的方法。也许这将激发你的解决方案。
#find largest groups for each year
maxgroups <- tapply(df$group, df$year, function(x) which.max(table(x)))
#create group names
maxpairs <- paste(names(maxgroups),levels(df$group)[maxgroups], sep=".")
#helper function
ifnotin<-function(val,set,ifnotin) {out<-val; out[!val%in%set]<-ifnotin; droplevels(out)}
#new factor indicating best group
tgroups <- ifnotin(interaction(df$year, df$group), maxpairs, NA)
#now transform the best groups by adding year to result (or whatever transformation you need to do)
transform(df, value=ifelse(!is.na(tgroups), value+year, value))
我不确定你的转型是否需要知道它是在哪个组/年。如果您只是需要知道它是否在需要转换的组中,您可以跳过tgroups
并使用
needstransform <- interaction(df$year, df$group) %in% maxpairs
但tgroups
的NA值适用于摘要tapply(df$value, droplevels(tgroups), mean)
等
答案 2 :(得分:0)
我不认为这是一个非常好的答案,因为它超级混淆(并且它没有使用你想要的 plyr 方法),但也许它会刺激别人的想法:
基本上,您只需要知道每年要查看的group
值。假设您在一个名为year
的变量中找出并存储这些值(与m
的原始数据的拆分顺序相同),然后您可以mapply
某些子集的函数每个按group
分割(按年份的数据),然后执行您想要的任何其他计算。
do.call(rbind, mapply(function(x,y) {
tmp <- x[x$group==y,]
#fun(tmp) # apply your function to the relevant subset
}, split(df,df$year), m, SIMPLIFY=FALSE))
我想到了三种不同的方式来生成m
。他们在这里:
m <- with(df, levels(group)[apply(table(group, year), 2, which.max)])
m <- levels(df$group)[sapply(split(df, df$year), function(x) which.max(sapply(split(x, x$group), nrow)))]
m <- with(df, levels(group)[apply(tapply(year, list(group, year), length),2,which.max)])
答案 3 :(得分:0)
这就是我提出的:
df2 <- ddply(
df,
.(year),
summarise,
result=sqrt(
value[group==names(which.max(table(df$group)))]
)
)