私はdfを持っています(部分的に以下にリストされています)。
account company sum
1 202003 B01 40.50
2 208001 B01 -71596.73
3 280250 B01 -6652.70
4 200001 B13 44362.77
5 202001 B13 13874.25
6 204001 B13 5744.20
7 204102 B13 295.00
8 285091 B13 317145.15
9 286101 B13 11471.13
10 298001 B13 396096.50
df1$sum
次の基準に基づいて、列の数値を新しいデータフレームに追加しようとしています。会社ごとに(B01
およびB13
)^ 20df1$sum
でdf1$accounts
始まるすべてのアカウントの列を集計し、それを呼び出す必要がありますdf2$Expenses1
(この例では、こと202003
や208001
会社のためB01
)。
別に私は^ 28と^ 29で始まるアカウントのすべてを集約し、それを呼び出す必要がありますdf2$Expenses2
(ので会社のためにB01
それが唯一のアカウントになり280250
、会社のためB13
には、アカウントの合計となり285091
、286101
そして298001
)。
最終的に、新しいデータフレームdf2
は次のようになります。
Company Expenses1 Expenses2
B01 -71,556.23 -6,652.7
B13 64,276.22 724,712.78
これで本当に助けていただければ幸いです!
整頓された
library(tidyverse)
df %>%
group_by(company) %>%
summarise(Expenses1 = sum(sum*grepl('^20', account)),
Expenses2 = sum(sum*grepl('^28|^29', account)))
# # A tibble: 2 x 3
# company Expenses1 Expenses2
# <chr> <dbl> <dbl>
# 1 B01 -71556 - 6653
# 2 B13 64276 724713
データテーブル付き
library(data.table)
setDT(df)
df[, lapply(c(Expenses1 = '^20',
Expenses2 = '^28|^29'),
function(patt) sum(sum*grepl(patt, account)))
, by = company]
# company Expenses1 Expenses2
# 1: B01 -71556.23 -6652.7
# 2: B13 64276.22 724712.8
本当に2つのグループしかない場合は、別のグループ化変数を作成してから、dcast
またはspread
例を使用できます。
df[, .(Expenses = sum(sum))
, by = .(company,
acct_type = paste0('Expenses_', ifelse(grepl('^20', account), '20', 'other')))] %>%
dcast(company ~ acct_type)
# company Expenses_20 Expenses_other
# 1: B01 -71556.23 -6652.7
# 2: B13 64276.22 724712.8
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加