4

我需要测试每个因素的“比索”值(见下面的复制代码)。一个因素是否达到“比索”总和的 50%,每个因素的值应粘贴到一个新对象“结果”中,否则,R 应评估哪个因素具有“比索”的最低聚合值,并考虑下一列中的因子再次汇总“比索”。基本上,此过程将最低得分的因素替换为下一个因素。该过程应该重复,直到一个因素超过 50% 的阈值。所以我的问题是,我从哪里开始?

set.seed(51)
Data <- sapply(1:100, function(x) sample(1:10, size=5))
Data <- data.frame(t(Data))
names(Data) <- letters[1:5]
Data$peso <- sample(0:3.5, 100, rep=TRUE) 

它应该像

If your first two rows are: 
  a  b  c  d  e peso
  8  2  3  7  9    1
  8  3  4  5  7    3
  9  7  4 10  1    2
 10  3  4  5  7    3   

What would you like for the total?  
      Totals_08  = 4
      Totals_09  = 2
      Totals_10  = 3
      etc?

因此,因子 8 获得了更大的份额 4/(4+2+3) = 0.4444444,但在 a 轮中没有达到 50% 的阈值。因此,我需要更多的东西:重复聚合,但现在考虑“b”列中的因子 7 而不是“a”列中的因子 9,因为它在第一轮中获得了最低的聚合值。

4

1 回答 1

1

目前尚不清楚您是否已经有了因素清单。如果您没有它,并且正在从数据集中获取它,您可以通过几种不同的方式获取它:

# Get a list of all the factors
myFactors <- levels(Data[[1]])  # If actual factors.
myFactors <-   sort(unique(unlist(Data)))  # Otherwise use similar to this line


然后要计算每个因子的总计,您可以执行以下操作

Totals <- 
 colSums(sapply(myFactors, function(fctr) 
     # calculate totals per fctr
     as.integer(Data$peso) * rowSums(fctr == subset(Data, select= -peso)) 
   ))

names(Totals) <- myFactors

这使

Totals
#    1   2   3   4   5   6   7   8   9  10 
#  132 153 142 122 103 135 118 144 148 128 



下一个:我不确定之后是否要与比索的总和或总数的总和进行比较。以下是两个选项,分为几个步骤:

# Calculate the total of all the Totals:
TotalSum <- sum(Totals)

# See percentage for each:
Totals / TotalSum
Totals / sum(as.integer(Data$peso))

# See which, if any, is greater than 50%
Totals / TotalSum > 0.50
Totals / sum(as.integer(Data$peso)) > 0.50

# Using Which to identify the ones you are looking for
which(Totals / TotalSum > 0.50)
which(Totals / sum(as.integer(Data$peso)) > 0.50)



请注意您对比索的抽样

您取了 的样本0:3.5,但是,该x:y序列仅给出整数。如果你想要分数,你可以使用seq()或者你可以取一个更大的序列,然后适当地划分:

option1 <-  (0:7) / 2
option2 <-  seq(from=0, to=3.5, by=0.5)

如果您想要 0:3 的整数以及 3.5 的值,请使用 c()

 option3 <- c(0:3, 3.5)
于 2012-11-16T05:21:29.610 回答