文字ベクトルに基づいて、データフレームから動的な列数を作成します

リチャード・ラッシュ

合計を構成する必要がある列のリストを指定して、1つ以上の列のデータを合計しようとしています。

例えば:

set.seed(3550)
# Creates data frame
month <- seq.Date(from = as.Date("2012-09-01"), by = "month", length.out = 50)
a <- rpois(50, 5000)
b <- rpois(50, 3000)
c <- rpois(50, 500)
d <- rpois(50, 1000)

df <- data.frame(month, a, b, c, d)
# Creates list of vectors
mylist <- list(this = "this", that = "that", other = "other")
mylist$this <- c("a")
mylist$that <- c("a", "b")
mylist$other <- c("a", "c", "d")

次のコードで希望の結果を得ることができます。

my_df <- df %>%
  group_by(month) %>%
  summarize(this = sum(!!!rlang::syms(mylist$this), na.rm = TRUE),
            that = sum(!!!rlang::syms(mylist$that), na.rm = TRUE),
            other = sum(!!!rlang::syms(mylist$other), na.rm = TRUE))

出力は次のとおりです。

# A tibble: 50 x 4
        month  this  that other
       <date> <int> <int> <int>
 1 2012-09-01  4958  7858  6480
 2 2012-10-01  4969  7915  6497
 3 2012-11-01  5012  7978  6483
 4 2012-12-01  4982  7881  6460
 5 2013-01-01  4838  7880  6346
 6 2013-02-01  5090  8089  6589
 7 2013-03-01  5013  8044  6582
 8 2013-04-01  4947  7942  6388
 9 2013-05-01  5065  8124  6506
10 2013-06-01  5020  8086  6521
# ... with 40 more rows

要約された列の数を動的に作成する方法を理解しようとすると、問題が発生します。summary呼び出し内のループは機能するかもしれないと思いましたが、機能しませんでした。

combine_iterations <- function(x, iter_list){
  a <- rlang::syms(names(iter_list))
  b <- x %>%
    group_by(month) %>%
    summarize(for (i in 1:length(a)){
      a[[i]] = sum(!!!rlang::syms(iter_list[i]), na.rm = TRUE)
    })
}

出力:

Error in lapply(.x, .f, ...) : object 'i' not found
Called from: lapply(.x, .f, ...)
サイドム

あなたはそれを少し複雑にしすぎています。要約をカスタマイズする場合はgroup_by %>% dorlang引用符/引用符なしの問題を使用して回避できます

combine_iterations <- function(x, iter_list){
    x %>%
      group_by(month) %>%
      do(
          as.data.frame(lapply(iter_list, function(cols) sum(.[cols])))
      )
}

combine_iterations(df, mylist)
# A tibble: 50 x 4
# Groups:   month [50]
#        month  this  that other
#       <date> <int> <int> <int>
# 1 2012-09-01  5144  8186  6683
# 2 2012-10-01  5134  8090  6640
# 3 2012-11-01  4949  7917  6453
# 4 2012-12-01  5040  8203  6539
# 5 2013-01-01  4971  7938  6474
# 6 2013-02-01  5050  7924  6541
# 7 2013-03-01  5018  8022  6579
# 8 2013-04-01  4945  7987  6476
# 9 2013-05-01  5134  8114  6590
#10 2013-06-01  4984  8011  6476
# ... with 40 more rows

identical(
    df %>% 
        group_by(month) %>% 
        summarise(this = sum(a), that = sum(a, b), other = sum(a, c, d)),

    ungroup(combine_iterations(df, mylist))
)
# [1] TRUE

または、purrr::map_dfデータフレームを作成する別のオプションdo

combine_iterations <- function(x, iter_list){
    x %>%
      group_by(month) %>%
      do({
          g = .
          map_df(iter_list, ~ sum(g[.x]))
      })
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

R:ベクトル値に基づいてデータフレームから複数の列を削除する

分類Dev

Rのデータフレームの列条件に基づいてベクトルを作成します

分類Dev

既存の文字ベクトルに基づいて、Rデータフレームに新しい文字列を作成します

分類Dev

Rは、条件に基づいて、ベクトルからデータフレーム列に異なる値をランダムに割り当てます

分類Dev

他のデータフレームに基づいて、数値ベクトルのnames()をある変数から別の変数に変更します

分類Dev

1つの列の条件に基づいて、他の列からプルして、データフレームに新しい変数を作成しますか?(dplyr)

分類Dev

Rの動的な値に基づいてデータフレームから列を選択します

分類Dev

R-一致した文字に基づいてデータフレームを作成し、それらを異なる方法でラベル付けします

分類Dev

名前のベクトル(文字ベクトル)に基づいて、データフレーム内の列の名前を変更します

分類Dev

リストまたはベクトルに基づいて別の列から抽出されたテキストを含むデータフレームに新しい列を作成します

分類Dev

データフレーム列の文字列値とセルの値を比較して、複数値ディクショナリに基づいて新しいデータフレームを作成するにはどうすればよいですか?

分類Dev

matplotlibを使用してプロットしながら、データフレーム列の文字列に基づいてカラーマップを作成する

分類Dev

Rの文字ベクトルからデータフレームに列を作成します

分類Dev

開始文字に基づいてデータフレームの列から値を抽出します

分類Dev

既存の数値列、列名などの文字列のリストと値としてタプルのリストに基づいてデータフレームに新しい列を作成します。

分類Dev

データフレーム内の値の増減に基づいて、データフレーム内の別のベクトルのソートされていない値に基づいてベクトルの値を合計します。

分類Dev

別のデータフレームからのルックアップ値に基づいてパンダ列を作成します

分類Dev

マルチ条件ロジックに基づいて、個別のパンダデータフレームから文字列を返します

分類Dev

ベクトル鍵に基づいてデータフレームをマージします

分類Dev

部分的な文字列の一致に基づいて、別のデータフレームから1つのデータフレーム列を埋めます

分類Dev

有効な値を持つ行数に基づいて、データフレームから列を削除します

分類Dev

rnorm関数を使用して、データフレームから他の列に基づく新しい列を作成します

分類Dev

複数のデータフレームからの操作に基づいてRに新しい列を作成する方法はありますか?

分類Dev

Python DataFrame:条件に基づいてデータフレーム列からカウントを取得しますか?

分類Dev

複数の列の値に基づいて新しいデータフレーム列を作成します

分類Dev

IDでグループ化しながら、他の列の値に基づいて新しいデータフレームを作成します

分類Dev

別のデータフレームからの複数の列条件に基づいて列を作成する

分類Dev

ベクトルに基づいてデータフレーム内の位置を抽出します

分類Dev

列の複数の値に基づいてデータフレームに新しい行を作成します

Related 関連記事

  1. 1

    R:ベクトル値に基づいてデータフレームから複数の列を削除する

  2. 2

    Rのデータフレームの列条件に基づいてベクトルを作成します

  3. 3

    既存の文字ベクトルに基づいて、Rデータフレームに新しい文字列を作成します

  4. 4

    Rは、条件に基づいて、ベクトルからデータフレーム列に異なる値をランダムに割り当てます

  5. 5

    他のデータフレームに基づいて、数値ベクトルのnames()をある変数から別の変数に変更します

  6. 6

    1つの列の条件に基づいて、他の列からプルして、データフレームに新しい変数を作成しますか?(dplyr)

  7. 7

    Rの動的な値に基づいてデータフレームから列を選択します

  8. 8

    R-一致した文字に基づいてデータフレームを作成し、それらを異なる方法でラベル付けします

  9. 9

    名前のベクトル(文字ベクトル)に基づいて、データフレーム内の列の名前を変更します

  10. 10

    リストまたはベクトルに基づいて別の列から抽出されたテキストを含むデータフレームに新しい列を作成します

  11. 11

    データフレーム列の文字列値とセルの値を比較して、複数値ディクショナリに基づいて新しいデータフレームを作成するにはどうすればよいですか?

  12. 12

    matplotlibを使用してプロットしながら、データフレーム列の文字列に基づいてカラーマップを作成する

  13. 13

    Rの文字ベクトルからデータフレームに列を作成します

  14. 14

    開始文字に基づいてデータフレームの列から値を抽出します

  15. 15

    既存の数値列、列名などの文字列のリストと値としてタプルのリストに基づいてデータフレームに新しい列を作成します。

  16. 16

    データフレーム内の値の増減に基づいて、データフレーム内の別のベクトルのソートされていない値に基づいてベクトルの値を合計します。

  17. 17

    別のデータフレームからのルックアップ値に基づいてパンダ列を作成します

  18. 18

    マルチ条件ロジックに基づいて、個別のパンダデータフレームから文字列を返します

  19. 19

    ベクトル鍵に基づいてデータフレームをマージします

  20. 20

    部分的な文字列の一致に基づいて、別のデータフレームから1つのデータフレーム列を埋めます

  21. 21

    有効な値を持つ行数に基づいて、データフレームから列を削除します

  22. 22

    rnorm関数を使用して、データフレームから他の列に基づく新しい列を作成します

  23. 23

    複数のデータフレームからの操作に基づいてRに新しい列を作成する方法はありますか?

  24. 24

    Python DataFrame:条件に基づいてデータフレーム列からカウントを取得しますか?

  25. 25

    複数の列の値に基づいて新しいデータフレーム列を作成します

  26. 26

    IDでグループ化しながら、他の列の値に基づいて新しいデータフレームを作成します

  27. 27

    別のデータフレームからの複数の列条件に基づいて列を作成する

  28. 28

    ベクトルに基づいてデータフレーム内の位置を抽出します

  29. 29

    列の複数の値に基づいてデータフレームに新しい行を作成します

ホットタグ

アーカイブ