如何在R中增加变量名称来处理循环

时间:2014-06-28 06:17:57

标签: r for-loop

我的数据集目前是20个问题的一组答案,有300个观察结果。

每个问题都标有q1,q2,q3等等。

每次观察都会产生1到10的反应。

以下代码就是我所拥有的。我想要的是当计数器在R中改变时q1会改变。

totaltenq1 <- sum(UpdatedQualtrix$tenq1)
totalnineq1 <- sum(UpdatedQualtrix$nineq1)
totaleightq1 <- sum(UpdatedQualtrix$eightq1)
totalsevenq1 <- sum(UpdatedQualtrix$sevenq1)
totalsixq1 <- sum(UpdatedQualtrix$sixq1)
totalfiveq1 <- sum(UpdatedQualtrix$fiveq1)
totalfourq1 <- sum(UpdatedQualtrix$fourq1)
totalthreeq1 <- sum(UpdatedQualtrix$threeq1)
totaltwoq1 <- sum(UpdatedQualtrix$twoq1)
totaloneq1 <- sum(UpdatedQualtrix$oneq1)

totaltenq2 <- sum(UpdatedQualtrix$tenq2)
totalnineq2 <- sum(UpdatedQualtrix$nineq2)
totaleightq2 <- sum(UpdatedQualtrix$eightq2)
totalsevenq2 <- sum(UpdatedQualtrix$sevenq2)
totalsixq2 <- sum(UpdatedQualtrix$sixq2)
totalfiveq2 <- sum(UpdatedQualtrix$fiveq2)
totalfourq2 <- sum(UpdatedQualtrix$fourq2)
totalthreeq2 <- sum(UpdatedQualtrix$threeq2)
totaltwoq2 <- sum(UpdatedQualtrix$twoq2)
totaloneq2 <- sum(UpdatedQualtrix$oneq2)

我想要的代码是

count = 20

for (i in 1:count){
totaltenq(i) <- sum(UpdatedQualtrix$tenq(i)
totalninq(I) <- sum(UpdatedQuatlrix$nineq(I)
etc
}

这样,当我将来再次这样做时,我可以告诉R下次有多少问题,它会改变它。这样,我没有10,000行代码来复制和粘贴我的代码20次。

1 个答案:

答案 0 :(得分:2)

我认为你根本不需要任何循环。这完全取决于您希望如何存储这些值。我不喜欢没有必要的变量。

这是一些示例数据。我只需要制作10行(观察),值为1-5。

set.seed(15)
Q<-3
numbs<-c("one","two","three","four","five","six","seven","eight","nine","ten")
qs<-paste0("q",1:Q)
qnumbs <- outer(numbs, qs, paste0)

UpdatedQualtrix <-data.frame(ID=1:10, 
    matrix(sample(1:5, 10*length(numbs)*Q, replace=T), nrow=10))
colnames(UpdatedQualtrix) <- c("ID",qnumbs)

现在我可以用

总结每一列
( Qsums<-colSums(UpdatedQualtrix[, qnumbs]) )

# oneq1   twoq1 threeq1  fourq1  fiveq1   sixq1 sevenq1 eightq1  nineq1   tenq1 
#    37      35      29      26      32      39      40      33      40      26 
# oneq2   twoq2 threeq2  fourq2  fiveq2   sixq2 sevenq2 eightq2  nineq2   tenq2 
#    37      31      19      29      25      38      36      35      28      27 
# oneq3   twoq3 threeq3  fourq3  fiveq3   sixq3 sevenq3 eightq3  nineq3   tenq3 
#    37      30      31      31      24      31      29      31      25      41 

如果我们想要每个问题的总数我们可以做

sapply(qs, function(a, b) sum(Qsums[paste0(b,a)]), b=numbs)

#  q1  q2  q3 
# 337 305 310 

或者,如果我们想要每个响应的计数,我们可以做

sapply(numbs, function(a, b) sum(Qsums[paste0(a,b)]), b=qs)

#   one   two three  four  five   six seven eight  nine   ten 
#   111    96    79    86    81   108   105    99    93    94 

您可能还想考虑融化您的数据,因为它是如此结构化。您可以使用reshape2库来提供帮助。你可以做到

require(reshape2)

mm <- melt(UpdatedQualtrix, id.vars="ID")
mm <- cbind(mm[,-2], colsplit(mm$variable, "q", c("resp","q")))
mm$resp <- factor(mm$resp, levels=numbs)

将您的数据转换为“高”格式,以便每个值都有自己的行,其中包含ID,值,响应和问题的列。

str(mm)

# 'data.frame': 300 obs. of  4 variables:
#  $ ID   : int  1 2 3 4 5 6 7 8 9 10 ...
#  $ value: int  4 1 5 4 2 5 5 2 4 5 ...
#  $ resp : Factor w/ 10 levels "one","two","three",..: 1 1 1 1 1 1 1 1 1 1 ...
#  $ q    : int  1 1 1 1 1 1 1 1 1 1 ...

然后我们可以更轻松地进行其他计算。你想要的总得分,你可以做

aggregate(value~q, mm, sum)
#   q value
# 1 1   337
# 2 2   305
# 3 3   310

如果您想要每个问题/答案的平均值,那么

with(mm, tapply(value, list(q,resp), mean))
#   one two three four five six seven eight nine ten
# 1 3.7 3.5   2.9  2.6  3.2 3.9   4.0   3.3  4.0 2.6
# 2 3.7 3.1   1.9  2.9  2.5 3.8   3.6   3.5  2.8 2.7
# 3 3.7 3.0   3.1  3.1  2.4 3.1   2.9   3.1  2.5 4.1