1

単純な問題で問題が発生していますが、単純な解決策が見つかりません。(この質問はおそらくduplicateですが、見つかりません!)

必要なのはmerge、計算後にリストを元のリストに戻すことです。

私がmerge行っている計算は複雑すぎるため、apply直接リストに載せる必要があります。したがって、元のデータセットに戻すには、個別に何らかの方法で行う必要があります。(mutateこの問題のため、ここでは直接使用できません)。

データを再現できないため、 を使用mtcarsして問題を示します。

元のリストがあり、それに計算を適用しています (どちらでもかまいません)。たとえば、次のようになります。

library(dplyr) 
library(purr) 

元のデータセットはリストです

dt = mtcars %>% 
  group_by(gear) %>% 
  split(.$gear)

次に、このリストで計算を行います。たとえば、次のようになります。

dt %>% 
  map(~summarise(., cluster = mean(disp)))

そして、私はlist.

私のデータの(実際の)構造は、次のようになります

$`3`
   gear cluster
1     3   326.3

$`4`
    gear cluster
 1     4   123

等々。私が必要とするのは、merge backこのリストを元のリストにすることだけです。これどうやってするの ?

私が必要とするのは(出力が必要です)、元listの値とmerged計算された値になることです(ここで再現するのは難しいです)。

何かのようなもの

$`3`

     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb cluster 
1   21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1  XXX
2   18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2  XXX
3   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1  XXX
4   14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     4  XXX

など、すべてのリストについて (df)

元のデータセットは data.frame ではなくリストであることを再度強調します。lists必要なのは、 ではなくをマージすることdata.frameです。

みたいなことを考えた

dt = mtcars %>% # my data is a list
  group_by(gear) %>% 
  split(.$gear)

fmerge = function(x) x %>% lapply(dt, ., by = 'gear')

dt %>% 
  map(~summarise(., cluster = mean(disp))) %>% 
  lapply(fmerge) 

また

dt %>% 
  map(~summarise(., cluster = mean(disp))) %>% 
  join_all(dt, ., by = 'gear')

しかし、うまくいきません。

どんな手掛かり ?

4

3 に答える 3

2

要素bind_rowsを rbind してから orを実行するために使用できますlistright_joinleft_join

mtcars %>% 
   group_by(gear) %>% 
   split(.$gear) %>% 
   map(~summarise(., cluster = mean(disp))) %>%
   bind_rows() %>%
   right_join(., mtcars, by = "gear")

ただし、これは、「ギア」の後にsplit/map/bind_rows/right_join「クラスター」を作成するだけで、なしで行うことができますmutategroup_by

mtcars %>% 
     group_by(gear) %>%
     mutate(cluster = mean(disp))

ただし、この単純化されたプロセスは、OP の元のデータセットでは機能しない可能性があると想定しています。

アップデート

OPのコメントに基づいて、対応する要素map2を実行するために使用できますleft_joinlist

dt %>%
    map(~summarise(., cluster = mean(disp))) %>% 
    map2(dt, ., left_join, by = "gear")

または、単一の が必要な場合はdata.frame、使用しますmap2df

dt %>%
    map(~summarise(., cluster = mean(disp))) %>% 
    map2_df(dt, ., left_join, by = "gear")
于 2016-09-05T11:11:14.763 に答える
1

考えられる解決策ですが、遅いためloop

計算を「リスト」に保存します

computation = dt %>% map(~summarise(., cluster = mean(disp)))

次に、両方をループしますlist

for(i in 1:length(dt)){
  dt[[i]] = merge(dt[[i]], computation[[i]], by = 'gear')
}

取得するため

$`3`
   gear  mpg cyl  disp  hp drat    wt  qsec vs am carb cluster
1     3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    1   326.3
2     3 18.7   8 360.0 175 3.15 3.440 17.02  0  0    2   326.3
3     3 18.1   6 225.0 105 2.76 3.460 20.22  1  0    1   326.3

等々。

于 2016-09-05T12:34:41.470 に答える
0

nest()次のように、 tidyr パッケージ (および ) から実行できる興味深いことを利用しunnest()ます。

library(tidyr)
library(dplyr)
library(purrr)

mtcars %>% 
  nest(-gear) %>% 
  mutate(cluster = map_dbl(data, ~ mean(.$disp))) %>% 
  unnest(data)
#> # A tibble: 32 × 12
#>     gear  cluster   mpg   cyl  disp    hp  drat    wt  qsec    vs    am
#>    <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1      4 123.0167  21.0     6 160.0   110  3.90 2.620 16.46     0     1
#> 2      4 123.0167  21.0     6 160.0   110  3.90 2.875 17.02     0     1
#> 3      4 123.0167  22.8     4 108.0    93  3.85 2.320 18.61     1     1
#> 4      4 123.0167  24.4     4 146.7    62  3.69 3.190 20.00     1     0
#> 5      4 123.0167  22.8     4 140.8    95  3.92 3.150 22.90     1     0
#> 6      4 123.0167  19.2     6 167.6   123  3.92 3.440 18.30     1     0
#> 7      4 123.0167  17.8     6 167.6   123  3.92 3.440 18.90     1     0
#> 8      4 123.0167  32.4     4  78.7    66  4.08 2.200 19.47     1     1
#> 9      4 123.0167  30.4     4  75.7    52  4.93 1.615 18.52     1     1
#> 10     4 123.0167  33.9     4  71.1    65  4.22 1.835 19.90     1     1
#> # ... with 22 more rows, and 1 more variables: carb <dbl>

このパイプの最初の 2 行、次に 3 行を実行すると、データ内のグループに対応するデータ セットの列があることがわかります。これにより、データを個別のリストに分割することなく、非常に複雑なことを行うことができます。

たとえば、次の例では、各歯車のデータに対して回帰分析を実行し (再度、パイプの最初の 2 行、次に 3 行を実行して、その動作を理解します)、結果をプロットします。

library(broom)
library(ggplot2)

mtcars %>% 
  nest(-gear) %>% 
  mutate(fits = map(data, ~ lm(mpg ~ hp, .)),
         predicted = map(fits, augment)) %>% 
  unnest(predicted) %>% 
  ggplot(aes(mpg, .fitted)) +
    geom_point() +
    facet_grid(. ~ gear)

ここに画像の説明を入力

于 2016-09-05T11:32:45.363 に答える