簡體   English   中英

R:將變量值傳遞給函數以確定rowSums中的范圍

[英]R: Passing variable values to function to determine range in rowSums

我統計了按季度排列的數據,看起來像這樣。 假設每個計數都是該季度的車禍次數。

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)為止的總的汽車事故的累積總數,如四分之一變量所表示的,例如,對於第一行,我想知道從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中獲取值並將其用作行和的端點。

將變量名稱傳遞給函數有很多幫助(例如, herehere ),但是像rowSums(df[ , 3:which(names(df) == "endcolumn")])只是將endcolumn值添加到了Q1中的值。

是我能找到的最接近的問題。 但是,我發現如果嘗試這樣做,它仍然不允許我改變要按行求和的列的范圍(例如,第一行為3:6,第三行為3:7)。第二)。

有沒有辦法使用rowSums將值從端列傳遞給函數?

注意:我意識到第二種選擇可能是使用四分之一變量中的值(例如Q4,Q5)並使用它們來標識端點列。 我之所以沒有概述問題的原因是因為一旦為t0編寫了此函數,我還希望能夠找到t0之前一年和之后一年的總和,並且我認為調整a會更容易通過使用“ 3:endcolumn +/- 4”的某些變體來實現功能,而不是嘗試將Q9更改為Q5或Q13。 但是,如果有一種簡單的方法可以做到這一點,那也將有所幫助。

並非最整潔,但這應該可行:

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

也就是說:對於每一行,從endcolumn列獲取相關索引,並從3rd到index求和。 將此總和放入此行t0單元中。

我建議改為在tidyrdplyr軟件包的幫助下進行此操作。 看一下下面的代碼示例(請注意,在您的問題中,大多數行的t0結果都錯誤(?),因為rowSum總是將rowSum放在第一行( rowSum[1,...] )每行的季度值各不相同-盡管如果這些是季度車禍,我不太確定這怎么可能?)。 無論如何,這是一個總結一個特定季度的示例(使用管道%>%語法來提高可讀性)。 如果您不熟悉tidyrdyplr我強烈建議您查看這些軟件包的小插圖。

library(dplyr)
library(tidyr)
# take your data frame
df %>% 
  # gather into long format
  gather(Q_column, value, -quarter, -endcolumn) %>% 
  # extract number from the column name
  extract(Q_column, "column", "Q(\\d+)") %>% 
  # group by the quarter and end column for calculations
  group_by(quarter, endcolumn) %>% 
  # summarize up to the desired column
  summarize(t0 = sum(value[column <= endcolumn - 2])) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM