首页 > 解决方案 > 是否有一个 R 函数相当于 Excel 的 $ 用于“保持参考单元常数”

问题描述

我是 R 新手,我已经尽我所能在谷歌上搜索以下问题的答案,但到目前为止还没有出现任何问题。

在 Excel 中,您可以在使用引用时通过将 $ 放在行号或列字母之前来保持特定列或行不变。当所有单元格都引用单个其他单元格中的某些内容时,这在跨多个单元格执行操作时很方便。例如,获取一个包含课程成绩的数据集:第 1 行是每个班级作业的总分(每列是一个作业),第 2:31 行是 30 名学生中每个学生的原始分数。在 Excel 中,为了计算正确百分比,我将每个学生在该作业中的分数引用到第一行,在引用中保持行不变,这样我就可以向下拖动并将该操作应用于第 1 行下方的所有 30 行。最重要的是,在 Excel 中,我还可以向右拖动以跨所有列执行此操作,而无需键入新操作。

执行此操作的最有效方法是什么 - 在对所有其他行执行操作时保持引用行常量,然后在 R 中在保持引用行常量的同时跨列应用它?到目前为止,我必须将参考行切片到一个新数据帧,从原始数据帧中删除该行,然后在每列键入一个操作,同时手动返回新数据帧以查找参考号以申请该列的操作。请参阅下面我的超级乏味的代码。

作为参考,每一列都是一个作业,第 1 行有该作业可能获得的分数。随后的所有行都是个别学生和他们的成绩。

# Extract number of points possible
outof <- slice(grades, 1)

# Now remove that row (Row 1)
grades <- grades[-c(1),]

# Turn number correct into percentage. The divided by
# number is from the sliced Row 1, which I had to
# look up and type one-by-one. I'm hoping there is
# code to do this automatically in R.
grades$ExamFinal < (grades$ExamFinal / 34) * 100
grades$Exam3 <- (grades$Exam3 / 26) * 100
grades$Exam4 <- (grades$Exam4 / 31) * 100
grades$q1.1 <- grades$q1.1 / 6
grades$q1.2 <- grades$q1.2 / 10
grades$q1.3 < grades$q1.3 / 6
grades$q2.2 <- grades$q2.2 / 3
grades$q2.4 <- grades$q2.4 / 12
grades$q3.1 <- grades$q3.1 / 9
grades$q3.2 <- grades$q3.2 / 8
grades$q3.3 <- grades$q3.3 / 12
grades$q4.1 <- grades$q4.1 / 13
grades$q4.2 <- grades$q4.2 / 5
grades$q6.1 <- grades$q6.1 / 5
grades$q6.2 <- grades$q6.2 / 6
grades$q6.3 <- grades$q6.3 / 11
grades$q7.1 <- grades$q7.1 / 7
grades$q7.2 <- grades$q7.2 / 8
grades$q8.1 <- grades$q8.1 / 7
grades$q8.3 <- grades$q8.3 / 13
grades$q9.2 <- grades$q9.2 / 13
grades$q10.1 <- grades$q10.1 / 8
grades$q12.1 <- grades$q12.1 / 12

标签: r

解决方案


You can use sweep

100*sweep(grades, 2, outof, "/")

#  ExamFinal  EXam3 EXam4
#1    100.00  76.92 32.26
#2     88.24  84.62 64.52
#3     29.41 100.00 96.77

Data:

grades
  ExamFinal EXam3 EXam4
1        34    20    10
2        30    22    20
3        10    26    30

outof
[1] 34 26 31

grades <- data.frame(ExamFinal=c(34,30,10),
                     EXam3=c(20,22,26),
                     EXam4=c(10,20,30))
outof <- c(34,26,31)

推荐阅读