R:将变量值传递给函数以确定rowSums

时间:2016-04-17 15:00:36

标签: r function

我有按季度安排的数据,看起来像这样。假设每个计数是该季度的车祸数。

df <- structure(list(quarter = c("Q4", "Q5", "Q8", "Q6", "Q3", "Q7"), column = c(6, 7, 10, 8, 5, 9), Q1 = c(8L, 7L, 4L, 10L, 9L, 6L), Q2 = c(9L, 6L, 7L, 8L, 5L, 4L), Q3 = c(15L, 17L, 14L, 20L, 19L, 16L), Q4 = c(25L, 21L, 24L, 23L, 20L, 22L), Q5 = c(20L, 22L, 16L, 18L, 17L, 21L), Q6 = c(15L, 13L, 12L, 16L, 10L, 11L), Q7 = c(9L, 7L, 11L, 6L, 5L, 8L), Q8 = c(23L, 24L, 26L, 22L, 27L, 25L)), row.names = c(1L, 2L, 3L, 4L, 5L, 6L), class = "data.frame", .Names = c("quarter", "endcolumn", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8"))

  quarter endcolumn Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
1      Q4         6  8  9 15 25 20 15  9 23
2      Q5         7  7  6 17 21 22 13  7 24
3      Q8        10  4  7 14 24 16 12 11 26
4      Q6         8 10  8 20 23 18 16  6 22
5      Q3         5  9  5 19 20 17 10  5 27
6      Q7         9  6  4 16 22 21 11  8 25

对于每一行,我想要达到特定时间点(t0)的总车祸的累积总和,如四分之一变量所示,例如对于第1行,我想知道Q1到Q4的车祸总数。得到的df看起来应该是这样的。

  quarter endcolumn Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 t0
1      Q4         6  8  9 15 25 20 15  9 23 57
2      Q5         7  7  6 17 21 22 13  7 24 73
3      Q8        10  4  7 14 24 16 12 11 26 114
4      Q6         8 10  8 20 23 18 16  6 22 95
5      Q3         5  9  5 19 20 17 10  5 27 33
6      Q7         9  6  4 16 22 21 11  8 25 88

请注意,总和的范围因行而异。为了制作上表,我将'quarter'值转换为变量'endcolumn'(例如Q4 =第6列),然后使用以下值:

df$t0 <- NA 
df[1, 11] <- rowSums(df[1, 3:6])
df[2, 11] <- rowSums(df[2, 3:7])
df[3, 11] <- rowSums(df[3, 3:10])
df[4, 11] <- rowSums(df[4, 3:8])
df[5, 11] <- rowSums(df[5, 3:5])
df[6, 11] <- rowSums(df[6, 3:9])

由于我的实际数据集比这里的数据集大得多,理想情况下我会编写一个函数来获取endcolumn中的值并将它们用作rowsum的端点。

将变量名称传递给函数(例如herehere)有很多帮助,但像rowSums(df[ , 3:which(names(df) == "endcolumn")])这样的东西只是将endcolumn值添加到Q1中的值。

This是我能找到的最接近我的问题。但是,我已经想通了,如果我尝试这样做,它仍然不允许我改变我想要按行加总的列的范围(即第一行为3:6,第3行为3:7)第二)。

有没有办法使用rowSums将值从endcolumn传递给函数?

注意:我意识到第二种选择可能是使用四分之一变量中的值(例如Q4,Q5)并使用它们来识别端点列。我没有以这种方式概述我的问题的原因是因为一旦我为t0编写这个函数,我也希望能够在t0之前和之后找到一年的总和,并且我认为调整它会更容易通过使用“3:endcolumn +/- 4”的某些变体而不是尝试将Q9更改为Q5或Q13来起作用。但如果有一个简单的方法来做后者,这也会有所帮助。

2 个答案:

答案 0 :(得分:2)

不是最好的,但这应该有效:

for(i in 1:nrow(df)){df$t0[i]  <- sum(df[i, 3:df$endcolumn[i]])}

即:对于每一行,从 endcolumn 列中获取相关索引,并将第3列中的列与索引相加。将此总和放在此行 t0 单元格中。

答案 1 :(得分:0)

我建议在SELECT roomId FROM (SELECT guestID from Guest WHERE age<20) Natural Join Reservation tidyr软件包的帮助下执行此操作。看一下下面的代码示例(请注意,在您的问题中,大多数行都有错误的(?)dplyr结果,因为您始终将t0放在第一行({{ 1}})尽管每一行的季度值不同 - 尽管如果这些是季度车祸,我不太确定这可能是怎么回事?)。无论如何,这里是总结一定季度的示例(使用管道rowSum语法来提高可读性)。如果您不熟悉rowSum[1,...]%>%,我强烈建议您查看这些套餐的插图。

tidyr