簡體   English   中英

r中的復雜求和-不同dfs中的不同列

[英]complicated sums in r - different columns in different dfs

我試圖在r中求和。 我有2個數據框。 其中一列包含3列(標簽,開始日期為doy(=年中的某日),結束日期為doy)。 另一個由2列組成(doy,bbb(=每天的數量))。

現在我想為df1的每一行添加從doy.0到doy.end的bbb之和。

# creating df1
tag<-c(1:5)
doy.0<-c(200:204)
doy.end<-c(207:211)
df1<-data.frame(tag, doy.0, doy.end)

# creating df2
doy<-c(200:211)
bbb<-c(12,10,18,16,20,11,15,19,25,23,21,20)
df2<-data.frame(doy,bbb)

  tag doy.0 doy.end
1   1   200     207
2   2   201     208
3   3   202     209
4   4   203     210
5   5   204     211

  doy bbb
1  200  12
2  201  10
3  202  18
4  203  16
5  204  20
6  205  11
7  206  15
8  207  19
9  208  25
10 209  23
11 210  21
12 211  20

所以我想在df1中添加bbb之和的附加列。 例如,對於標簽1,我希望bbb從doy 200到doy 207(標簽1應該為121,標簽2應該為134,依此類推)。

我已經玩了一些for循環,但無法弄清楚。 我將衷心感謝您的幫助! 另外,如果您可以想到一個更好的標題,請隨時進行更改。 我什至不知道該怎么稱呼這個問題,那真是令人討厭...

您的總和是否始終具有應為8個連續“ bbb”-值之和的模式? 然后這將起作用:

library(dplyr)
library(zoo)    
df1 %>% 
    mutate(newvar = rollsum(df2$bbb, 8))

  tag doy.0 doy.end newvar
1   1   200     207    121
2   2   201     208    134
3   3   202     209    147
4   4   203     210    150
5   5   204     211    154
df1$sum.bbb<-0

for(i in 1: nrow(df1)){
df1$sum.bbb[i]<-sum(df2[which(df2$doy[] == df1$doy.0[i]):which(df2$doy[] == df1$doy.end[i]),2])
}
> df1
  tag doy.0 doy.end sum.bbb
1   1   200     207     121
2   2   201     208     134
3   3   202     209     147
4   4   203     210     150
5   5   204     211     154

使用data.frame:

df1b <- do.call(rbind, 
                apply(df1, 
                      1, 
                      function(x) data.frame(tag = rep(x["tag"], x["doy.end"] - x["doy.0"] + 1), 
                                             doy = x["doy.0"]:x["doy.end"])))

merge(df1, aggregate(bbb ~ tag, merge(df1b, df2), sum))
  tag doy.0 doy.end bbb
1   1   200     207 121
2   2   201     208 134
3   3   202     209 147
4   4   203     210 150
5   5   204     211 154

和usign data.table:

library(data.table)
df1 <- as.data.table(df1)
df2 <- as.data.table(df2)

df1[df2, 
    on = .(doy.0 <= doy, doy.end >= doy), 
    allow.cartesian = TRUE][,
      .(doy.0 = min(doy.0), doy.end = max(doy.end), bbb = sum(bbb)),
      by = .(tag)]
   tag doy.0 doy.end bbb
1:   1   200     207 121
2:   2   201     208 134
3:   3   202     209 147
4:   4   203     210 150
5:   5   204     211 154

使用tidyverse的解決方案,循環隱藏在purrr :: map中:

replyr::replyr_bind_rows(
  purrr::map(
    replyr::replyr_split(df1,"tag"),
    function(x) data.frame(tag=x$tag,
                           df2 %>% filter((doy>=x$doy.0)&(doy<=x$doy.end)) %>% summarise(bbb=sum(bbb)))
))
#  tag bbb
#1   1 121
#2   2 134
#3   3 147
#4   4 150
#5   5 154

您可以使用data.table和非等價聯接來創建它。 如果您的總和始終具有相同的模式,則@Len的答案非常好。 如果您的總和具有不同的模式,則data.table是一個非常快速的解決方案。

library(data.table)

# add sum of bbb to table 1 from table 2
dt1[, bbb := dt2[dt1, on=.(doy >= doy.0, doy <= doy.end), sum(bbb), by=.EACHI]$V1]


dt1
   tag doy.0 doy.end bbb
1:   1   200     207 121
2:   2   201     208 134
3:   3   202     209 147
4:   4   203     210 150
5:   5   204     211 154

數據:

tag<-c(1:5)
doy.0<-c(200:204)
doy.end<-c(207:211)
dt1<- data.table(tag, doy.0, doy.end) # data.table instead of data.frame

# creating dt2
doy<-c(200:211)
bbb<-c(12,10,18,16,20,11,15,19,25,23,21,20)
dt2<- data.table(doy,bbb) # data.table instead of data.frame

我們可以進行模糊連接和聚合:

library(fuzzyjoin)
library(dplyr)
fuzzy_join(df1, df2, c(doy.0 = "doy", doy.end = "doy"),
           list(`<=`,`>=`)) %>%
  group_by(tag,doy.0,doy.end) %>%
  summarize_at("bbb",sum) %>%
  ungroup

# # A tibble: 5 x 4
#     tag doy.0 doy.end   bbb
#   <int> <int>   <int> <dbl>
# 1     1   200     207   121
# 2     2   201     208   134
# 3     3   202     209   147
# 4     4   203     210   150
# 5     5   204     211   154

和基數R的翻譯:

x <- expand.grid(tag= df1$tag,doy = df2$doy)
x <- merge(x,df1,all.x=TRUE)
x <- merge(x,df2,all.x=TRUE)
x <- subset(x, doy >= doy.0 & doy <= doy.end)
x <- aggregate(bbb ~ tag, x, sum)
merge(df1,x)
#   tag doy.0 doy.end bbb
# 1   1   200     207 121
# 2   2   201     208 134
# 3   3   202     209 147
# 4   4   203     210 150
# 5   5   204     211 154

暫無
暫無

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

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