集合的所有可能子集

时间:2014-10-31 14:30:44

标签: r subset

我的环境:目前是Win7和R 3.1.1。

我拥有某个公司品牌和相应市场份额的数据集: (Apple,0.50),(诺基亚,0.24),(HTC,0.12),(RIM,0.07),(Palm,0.03)等....

所以我有一套如(苹果,诺基亚,HTC,RIM ......)。

我想要所有可能的子集,其中包含其组件的市场份额的总和。

例如,一个子集(Apple,HTC),其值为(0.50 + 0.12)。

我怎样才能实现这个想法?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

试试这个:

# sample data
df <- data.frame(company = c('Apple','Nokia','HTC','RIM','Palm'),
                share = c(.5,.24,.12,.07,.03))

# create index of all combinations
allcombsindex <- lapply(1:nrow(df),function(x){
  combn(1:length(df$company),x,simplify = F)
})
# get rid of extra level
allcombsindex <- do.call('c',allcombsindex)

# paste together company names and sum the shares
result <- sapply(allcombsindex,function(x,y = df){
  c(paste(y$company[x],collapse = ","),
  sum(y$share[x]))
})

# transpose upright with correct classes
data<-as.data.frame(t(result),stringsAsFactors = F)
data$V2 <- as.numeric(data$V2)

答案 1 :(得分:0)

感谢ARobertson,我几乎就在那里,这就是我现在所拥有的。

df <- data.frame(company = c('B','m1','m2','m3','m4','m5','m6','m7'),
             share = c(0, 0.235, 0.252, 0.063, 0.073, 0.069, 0.022, 0.286))

# create index of all combinations
allcombsindex <- lapply(1:nrow(df),function(x){
  combn(1:length(df$company),x,simplify = F)
})
# get rid of extra level
allcombsindex <- do.call('c',allcombsindex)

# paste together company names and sum the shares
result <- sapply(allcombsindex,function(x,y = df){
  c(paste(y$company[x],collapse = ","),
    sum(y$share[x]))
})

# transpose upright
data<-as.data.frame(t(result))

# from Factor into Numeric, see the class(data$V2)
as.numeric.factor <- function(x) {as.numeric(levels(x))[x]}

# Define market share summation
m<-as.numeric.factor(data$V2)

# And now good looking data frame 
data_working<-data.frame(data$V1,m)

# the limit repertory
# r=0.5, s=0.75
m0<-0.5*(1-0.75)/(1-0.5*0.75)

data_working2<-data.frame(data_working, m0)

但是我想要进步,因为这是我的目标的一半。 首先,我需要比较data_working2行中的m和m0。 其次,根据m和m0之间的比较,我想返回m或0。 我已经尝试过了:

compare<-function(m,m0){if (m > m0) return(m) else return (0)}

data2<-apply(data1, 1, compare) 

它失败了。但是这个有用了!

# compare the limit repertoty with existing repertory

compare<-ifelse(data_working2[,2]>data_working2[,3],data_working2[,2],0)