我需要为每个因素测试'pers'的值(请参阅下面的复制代码)。一个因子是否达到'比索'总和的50%,每个因子的值应该粘贴到一个新的对象'结果'中,否则,R应该评估哪个因子具有'peso'的最低聚合值,并考虑再次聚合'peso'的下一栏中的因子。基本上,这个过程取代了下一个因素的最低得分因子。该过程应该重复,直到一个因子超过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,但在第一轮中没有达到50%的阈值。因此,我需要更多的东西:重复聚合,但现在考虑列'b'中的因子7而不是'a'列中的因子9,因为它在第一轮中获得了最低的聚合值。
答案 0 :(得分: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)