2017-12-15 12 views
2

特定の行の値に応じて、グループ化されたdplyr tibble内の列の名前を変更するにはどうすればよいですか?次の図は、私のチブルがどのように見えるか、そして操作後のチューブルの見方を示しています。行の値(dplyr)でグループ化されたチブルの列の名前を変更

enter image description here

私は、次のコードを試してみましたが、「名前」欄から柔軟に新しい列名を述べることができるのカラム名の変更機能を記述するために管理していませんでした。

library(dplyr) 

df <- data.frame(
"splitvar"=c(1,1,1,2,2,3,3,3,3), 
"value"=c(1,4,2,5,6,9,11,13,12), 
"name"=c("Harold","Harold","Harold","Jane","Jane","George","George","George","George"), 
stringsAsFactors=F 
) 

grouped_tbl <- df %>% 
    group_by(splitvar) %>% 
    eval(parse(
    paste0("rename(",unique(name)," = value)") 
)) 

関連:このようにReplacement for "rename" in dplyr

+2

列は、私はあなたのポイントを参照してください唯一の単一の名前 – akrun

+0

を持つことができますので、あなたは3 data.framesの 'list'にsplit''する必要があるかもしれません。グループ化されたTibblesの列名は常に同じでなければならないと言っています。 – nilsole

+0

@akrun古い列を変更せずに新しい列を追加する方法はありますか?ここでは柔軟な関数を書くのが難しいです。 'grouped_tbl <- df %>% group_by(splitvar)%>% mutate(unique(name)= value)'; "group_by(splitvar)%>% mutate(unique(name)=" '助けてくれてありがとう) – nilsole

答えて

3

library(tidyverse) 

df %>% 
    split(.$splitvar) %>% 
    map(~rename(., !!unique(.$name) := "value")) 

それはquosure-事のまわりで私の頭を取得し、いくつかの時間がかかりましたが、programming with dplyr

を見て試してみて取りますコードの出力は、

$`1` 
    splitvar Harold name 
1  1  1 Harold 
2  1  4 Harold 
3  1  2 Harold 

$`2` 
    splitvar Jane name 
4  2 5 Jane 
5  2 6 Jane 

$`3` 
    splitvar George name 
6  3  9 George 
7  3  11 George 
8  3  13 George 
9  3  12 George 
です。
+0

これらを単一のデータセットに戻す必要がある場合は、 'map_dfr'(' bind_rows'に基づいて)を使用できます。 – aosmith

1

分割して新しい列を作成し、再度結合することができます。

は、ここで私はtidyevalの代替としてrename_atを使用nest/unnesttidyr)とmappurrr

library(tidyr) 
library(purrr) 

を経由してオプションです。

df %>% 
    group_by(splitvar) %>% 
    nest() %>% 
    mutate(data = map(data, function(x) rename_at(x, "value", funs(unique(x$name))))) %>% 
    unnest() 

# A tibble: 9 x 5 
    splitvar Harold name Jane George 
    <dbl> <dbl> <chr> <dbl> <dbl> 
1  1  1 Harold NA  NA 
2  1  4 Harold NA  NA 
3  1  2 Harold NA  NA 
4  2  NA Jane  5  NA 
5  2  NA Jane  6  NA 
6  3  NA George NA  9 
7  3  NA George NA  11 
8  3  NA George NA  13 
9  3  NA George NA  12 

これは私が tidyr を経由して行う「再形成」の問題である可能性があります。しかし、これは列を保持しませんname

df %>% 
    group_by(splitvar) %>% 
    mutate(row = row_number()) %>% 
    spread(name, value) 

# A tibble: 9 x 5 
# Groups: splitvar [3] 
    splitvar row George Harold Jane 
* <dbl> <int> <dbl> <dbl> <dbl> 
1  1  1  NA  1 NA 
2  1  2  NA  4 NA 
3  1  3  NA  2 NA 
4  2  1  NA  NA  5 
5  2  2  NA  NA  6 
6  3  1  9  NA NA 
7  3  2  11  NA NA 
8  3  3  13  NA NA 
9  3  4  12  NA NA 
関連する問題