簡體   English   中英

對R中的選定列和行求和

[英]Sum selected columns and rows in R

有人知道如何在特定條件下對選定列的行求和嗎?

例如,我有五個列,其行按2000年至2008年的年份進行排序。我只需要對“ year <2006”中的行進行求和,然后添加一個新的總計列(因為不涉及其他年份,所以使用了NA) 。

我想group_by不起作用,因為我不需要按組求和

我的數據是

A <- c(1,2,3,4,5,6,7,8,9,10)
B <- c(1,2,3,4,5,6,7,8,9,10)
Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)

dta <- as.data.frame(A,B, Year)

我很想獲得類似的東西

TotalColumn Year
 2          2000
 4          2001      
 6          2000
 8          2001
 10         2003
 12         2004
 14         2005
 NA         2006
 NA         2007
 NA         2008

ifelse在這里可能是一個不錯的選擇:

 A <- c(1,2,3,4,5,6,7,8,9,10)
 B <- c(1,2,3,4,5,6,7,8,9,10)
 Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)

 dta <- as.data.frame(cbind(rep(NA, each = length(A)), Year))
 colnames(dta) <- c("TotalColumn", "Year")
 dta$TotalColumn <- ifelse(dta$Year < 2006, A + B, NA)

dta輸出

   TotalColumn Year
1            2 2000
2            4 2001
3            6 2000
4            8 2001
5           10 2003
6           12 2004
7           14 2005
8           NA 2006
9           NA 2007
10          NA 2008

使用data.table(根據弗蘭克的評論進行更新)

library(data.table)
A <- c(1,2,3,4,5,6,7,8,9,10)
B <- c(1,2,3,4,5,6,7,8,9,10)
Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)
dta <- data.table(A, B, Year)
dta[Year < 2006, TotalColumn := A+B][, .(TotalColumn, Year)]

或者,您可以使用弗蘭克的建議,通過將最后一行替換為來編輯dta

dta[Year < 2006, TotalColumn := A+B][, c("A", "B") := NULL]

結果:

    TotalColumn Year
 1:           2 2000
 2:           4 2001
 3:           6 2000
 4:           8 2001
 5:          10 2003
 6:          12 2004
 7:          14 2005
 8:          NA 2006
 9:          NA 2007
10:          NA 2008

嘗試在purrr中使用by_row函數

A <- c(1,2,3,4,5,6,7,8,9,10)
B <- c(1,2,3,4,5,6,7,8,9,10)
Year <- c(2000, 2001, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008)
dta <- data.frame(A,B, Year)


Total_col <- dta %>% 
  filter(Year < 2006) %>% 
  select(A,B) %>% 
  purrr::by_row(sum, .collate = "cols", .to = "Total_Col") 

yr_total_Col <- dta %>% filter(Year < 2006) %>% select(Year)
Total_col <- cbind(Total_col,yr_total_Col)

這應該給你。

dta.x <- full_join(dta,Total_col) %>% select(Year,Total_Col)

#       Year Total_Col
#   1  2000         2
#   2  2001         4
#   3  2000         6
#   4  2001         8
#   5  2003        10
#   6  2004        12
#   7  2005        14
#   8  2006        NA
#   9  2007        NA
#   10 2008        NA

暫無
暫無

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

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