2017-10-20 12 views
1

私は、他のすべての列にあるすべての単語を収集して書式を設定する新しい列を作成しようとしています。可能であれば、私はdplyrを使ってこれをしたいと思います。 オリジナルデータフレーム:dplyr mutate - 1行を関数の引数として渡すにはどうすればよいですか?

df %>% 
    rowwise() %>% 
    mutate(newColumn = myFunc(.)) 

そして、このような出力を見てい::私はこれをしようとすると

 columnA  columnB  newColumn 
1   A   Z    AZ   
2   B   Y    BY   
3   C   X    CX   
4   D   W    DW   
5   E   V    EV   
6   F   U    FU  

を簡略化した例として、

df <- read.table(text =  " columnA  columnB  
       1   A   Z      
       2   B   Y      
       3   C   X      
       4   D   W      
       5   E   V     
       6   F   U   " ) 

、私のような何かを期待しています私のコードでは、出力は次のようになります。

 columnA  columnB  newColumn 
1   A   Z    ABCDEF   
2   B   Y    ABCDEF   
3   C   X    ABCDEF  
4   D   W    ABCDEF  
5   E   V    ABCDEF  
6   F   U    ABCDEF 

myFuncは引数として1行を取る必要がありますが、私はrowwise()を使ってみると関数全体にtibbleを渡しているようです(これはmyFuncに印刷関数を追加して見ることができます)。

どのようにして1行だけを渡し、これを反復して実行すれば、すべての行に機能を適用できますか?これはdplyrでできますか?

編集:

myfuncではは私の質問のために簡略化されています。実際の関数は次のようになります。

get_chr_vector <- function(row) { 

    row <- row[,2:ncol(row)] # I need to skip the first row 
    words <- str_c(row, collapse = ' ') 
    words <- str_to_upper(words) 
    words <- unlist(str_split(words, ' ')) 
    words <- words[words != ''] 
    words <- words[!nchar(words) <= 2] 
    words <- removeWords(words, stopwords_list) # from the tm library 
    words <- paste(words, sep = ' ', collapse = ' ') 
} 
+0

あなたは 'myFunc'を共有できますか?'df'はどのように見えますか? – www

+0

私は誤解しているかもしれませんが、 'df%>%mutate(newColumn = paste0(columnA、columnB))'は望みの結果を提供しませんか? –

+0

私は私の質問の目的のために私の機能を単純化しました。私が使っている実際の機能は私のポストに埋め込まれています。 –

答えて

1

は、あなたが複数の単項を通じて結果、任意の列に、チェーンに任意の関数を適用することが可能にする、?dplyr::do?purrr::mapを見てみましょう動作するはずです演算子。たとえば、あなたの元data.frameから行で構成される列Xは今の1x2 data.frame S(またはtibble複数可)を含んでいること、

df1 <- df %>% rowwise %>% do(X = as_data_frame(.)) %>% ungroup 
# # A tibble: 6 x 1 
#     X 
# *   <list> 
# 1 <tibble [1 x 2]> 
# 2 <tibble [1 x 2]> 
# ... 

注意してください。 を使用して、それぞれをカスタムmyFuncに渡すことができます。所望に応じて

myFunc <- function(Y) {paste0(Y$columnA, Y$columnB)} 
df1 %>% mutate(Result = map(X, myFunc)) 
# # A tibble: 6 x 2 
#     X Result 
#    <list> <list> 
# 1 <tibble [1 x 2]> <chr [1]> 
# 2 <tibble [1 x 2]> <chr [1]> 
# ... 

Resultカラムは現在、元data.frameの各行に適用さmyFuncの出力を含んでいます。値を取得するには、tidyr::unnestオペレーションを連結します。所望であれば

df1 %>% mutate(Result = map(X, myFunc)) %>% unnest 
# # A tibble: 6 x 3 
# Result columnA columnB 
# <chr> <fctr> <fctr> 
# 1  AZ  A  Z 
# 2  BY  B  Y 
# 3  CX  C  X 
# ... 

unnestは、unnest(Result)は例えば、特定の列に限定することができます。

EDIT:あなたの元data.frameは2つだけの列が含まれているため、あなたが実際にdoステップをスキップし、代わりにpurrr::map2を使用することができます。構文はmapに非常によく似ています

myFunc <- function(a, b) {paste0(a,b)} 
df %>% mutate(Result = map2(columnA, columnB, myFunc)) 

myFuncことは、現在のバイナリ関数として定義されます。

+0

これはそれでした!どうもありがとうございます。 –

+0

うれしかったです。 –

0

これは

df <- read.table(text =  " columnA  columnB  
       1   A   Z      
       2   B   Y      
       3   C   X      
       4   D   W      
       5   E   V     
       6   F   U   " ) 

df %>% 
    mutate(mutate_Func = paste0(columnA,columnB)) 

    columnA columnB mutate_Func 
1  A  Z   AZ 
2  B  Y   BY 
3  C  X   CX 
4  D  W   DW 
5  E  V   EV 
6  F  U   FU 
関連する問題