![](/img/trans.png)
[英]R new column (variable) that rowSums across lists with NULL values
[英]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中獲取值並將其用作行和的端點。
將變量名稱傳遞給函數有很多幫助(例如, here和here ),但是像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單元中。
我建議改為在tidyr
和dplyr
軟件包的幫助下進行此操作。 看一下下面的代碼示例(請注意,在您的問題中,大多數行的t0
結果都錯誤(?),因為rowSum
總是將rowSum
放在第一行( rowSum[1,...]
)每行的季度值各不相同-盡管如果這些是季度車禍,我不太確定這怎么可能?)。 無論如何,這是一個總結一個特定季度的示例(使用管道%>%
語法來提高可讀性)。 如果您不熟悉tidyr
和dyplr
我強烈建議您查看這些軟件包的小插圖。
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.