2017-10-20 12 views
1

J'essaie de créer une nouvelle colonne dans mon fichier qui collecte et formate tous les mots trouvés dans toutes les autres colonnes. Je voudrais le faire en utilisant dplyr, si possible. dataframe Original:dplyr mute - Comment passer une ligne comme argument de fonction?

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

Comme un exemple simplifié, j'espère faire quelque chose comme:

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

et ont l'apparence de sortie comme ceci:

 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  

Lorsque je tente cette dans mon code, la sortie ressemble à:

 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 devrait prendre une ligne comme argument mais quand j'essaye d'employer rowwise() je semble passer le pib intégralement dans la fonction (je peux voir ceci d'ajouter une fonction d'impression dans myFunc).

Comment est-ce que je peux passer juste une rangée et faire ceci itérativement de sorte qu'il applique la fonction à chaque rangée? Cela peut-il être fait avec dplyr?

Edit:

myFunc dans l'exemple est simplifiée pour le bien de ma question. La fonction réelle ressemble à ceci:

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

Pourriez-vous partager 'myFunc'?Et à quoi ressemble 'df'? – www

+0

Peut-être ai-je mal compris, n'est-ce pas '' df%>% mute '(newColumn = paste0 (colonneA, columnB)) 'donne le résultat désiré? –

+0

J'ai simplifié ma fonction dans le but de ma question. La fonction réelle que j'utilise a été éditée dans mon message. –

Répondre

1

Jetez un oeil à ?dplyr::do et ?purrr::map, qui vous permettent d'appliquer des fonctions arbitraires à des colonnes arbitraires et à enchaîner les résultats par plusieurs unaire les opérateurs. Par exemple,

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]> 
# ... 

Notez que la colonne X contient maintenant data.frame s (1x2 ou tibble s) composé de lignes de votre data.frame d'origine. Vous pouvez maintenant passer chacun à votre myFunc personnalisé en utilisant map.

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 colonne contient maintenant la sortie de myFunc appliquée à chaque ligne de votre data.frame original, comme on le souhaite. Vous pouvez récupérer les valeurs en concaténant une opération 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 
# ... 

Si vous le souhaitez, unnest peut se limiter à des colonnes spécifiques, par exemple, unnest(Result).

EDIT: Parce que votre data.frame d'origine ne contient que deux colonnes, vous pouvez réellement sauter la do étape et utiliser purrr::map2 à la place. La syntaxe est très similaire à map:

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

Notez que myFunc est maintenant défini en fonction binaire.

+0

Ça l'a fait! Merci beaucoup. –

+0

Heureux que cela a fonctionné. –

0

Cela devrait fonctionner

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