仅将功能应用于特定级别的因子?

时间:2014-05-07 14:57:36

标签: r

我有一个像这样的数据框:

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

我需要为每年应用一个函数(我打算用plyrsummarise),但在因子级别上使用最多的行(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

4 个答案:

答案 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)))]
        )
    )