2017-06-30 2 views
0

問題:dplyr/tibbleを使用してadd_rowしたいです。私の例ではAでデータをグループ化し、次にグループ名Aを含むadd_rowをBの値にしたいとします。do add_rowとgroup_byの問題。 add_rowにgroup_by変数名が必要です

私が直面している問題は、Group_by変数AをA私が何を試しても、常にその列の値としてエラーまたはNAが戻ってきます。

  1. 再現例:

    example <- data.frame(A = sample(letters[1:3],10,replace = TRUE), 
           B = sample(letters[24:26],10,replace = TRUE), 
           C = sample(1:3,10,replace = TRUE)) 
    
  2. 例データの出力:私は実行したい

     A B C 
        1 c y 2 
        2 b x 3 
        3 c y 1 
        4 b y 1 
        5 c z 1 
        6 a x 1 
        7 b x 1 
        8 c z 2 
        9 a y 3 
        10 c y 1 
    
  3. コード。

    answer <- example %>% 
        mutate(A = as.character(A), 
         B = as.character(B)) %>% 
        group_by(A) %>% 
        do(add_row(., 
          B = "ADDED", 
          C = "ADDED")) 
    
  4. データの出力:NAがあり、私はそれがグループ名(A、B、またはC)を言いたいデータの出力、でそう

     A  B  C 
        1  a  x  1 
        2  a  y  3 
        3 <NA> ADDED ADDED 
        4  b  x  3 
        5  b  y  1 
        6  b  x  1 
        7 <NA> ADDED ADDED 
        8  c  y  2 
        9  c  y  1 
    10  c  z  1 
    11  c  z  2 
    12  c  y  1 
    13 <NA> ADDED ADDED 
    

私はグループ変数名をそこに入れてみましたが、エラーが発生しません。

ありがとうございます!

答えて

3

doに直接追加できます。

example %>% 
    mutate_if(is.factor, as.character) %>% 
    group_by(A) %>% 
    do(add_row(., 
       A = unique(.$A), 
       B = "ADDED", 
       C = "ADDED")) 

最後にtidyr::fillを使用してください。グループ化変数が満たされているので、最初にungroupにする必要があります。

library(tidyr) 

example %>% 
    mutate_if(is.factor, as.character) %>% 
    group_by(A) %>% 
    do(add_row(., 
       B = "ADDED", 
       C = "ADDED")) %>% 
    ungroup() %>% 
    fill(A) 

# A tibble: 13 x 3 
     A  B  C 
    <chr> <chr> <chr> 
1  a  z  2 
2  a  x  1 
3  a  y  2 
4  a ADDED ADDED 
5  b  y  1 
6  b  z  1 
7  b ADDED ADDED 
8  c  z  2 
9  c  y  2 
10  c  z  2 
11  c  y  2 
12  c  z  1 
13  c ADDED ADDED 
+0

aosmith、あなたの第二の答えは私が持っていた本当のデータセット/問題のために働きました。実際のデータセットに。$ Aを使用すると、add_rowのコピーが2つ作成されました。なぜそれができなかったのか分かりませんが、あなたが提供した2番目のソリューションはうまく機能しました。お手伝いありがとう!私はfill()について学ばなければなりません –

+0

@MattD最初のオプションで 'unique 'を忘れました。 – aosmith

0
library(zoo) 

df=read.table(text='A  B  C 
       1  a  x  1 
       2  a  y  3 
       3 NA ADDED ADDED 
       4  b  x  3 
       5  b  y  1 
       6  b  x  1 
       7 NA ADDED ADDED 
       8  c  y  2 
       9  c  y  1 
       10  c  z  1 
       11  c  z  2 
       12  c  y  1 
       13 NA ADDED ADDED',header=TRUE,stringsAsFactors=FALSE) 

df$A=na.locf(df$A) 

> df 
    A  B  C 
1 a  x  1 
2 a  y  3 
3 a ADDED ADDED 
4 b  x  3 
5 b  y  1 
6 b  x  1 
7 b ADDED ADDED 
8 c  y  2 
9 c  y  1 
10 c  z  1 
11 c  z  2 
12 c  y  1 
13 c ADDED ADDED 
0
library(tidyverse) 

example <- tibble(A = sample(letters[1:3], 10, replace = TRUE), 
        B = sample(letters[24:26], 10, replace = TRUE), 
        C = sample(1:3, 10, replace = TRUE)) %>% 
    mutate(C = as.character(C)) %>% 
    arrange(A) 

to_be_added <- example %>% distinct(A) %>% cbind(B = "ADDED", C = "ADDED") 

bind_rows(example, to_be_added) %>% arrange(A) 
#> # A tibble: 13 x 3 
#>  A  B  C 
#> <chr> <chr> <chr> 
#> 1  a  z  2 
#> 2  a  y  1 
#> 3  a ADDED ADDED 
#> 4  b  x  1 
#> 5  b  z  1 
#> 6  b  z  1 
#> 7  b  y  3 
#> 8  b  y  1 
#> 9  b  y  1 
#> 10  b ADDED ADDED 
#> 11  c  y  1 
#> 12  c  z  1 
#> 13  c ADDED ADDED 
関連する問題