2017-05-04 4 views
3

Reihen in verschachtelten data_frames zählen ist hier ein stummes Beispiel Datenrahmen:Wie mit dplyr

df <- data_frame(A = c(rep(1, 5), rep(2, 4)), B = 1:9) %>% 
    group_by(A) %>% 
    nest() 

, die wie folgt aussieht:

> df 
# A tibble: 2 × 2 
     A    data 
    <dbl>   <list> 
1  1 <tibble [5 × 1]> 
2  2 <tibble [4 × 1]> 

Ich möchte eine dritte Spalte mit Einträgen N hinzuzufügen genannt gleich auf die Anzahl der Zeilen in jedem verschachtelten data_frame in data. Ich dachte, das würde funktionieren:

> df %>% 
+ mutate(N = nrow(data)) 
Error: Unsupported type NILSXP for column "N" 

Was läuft falsch?

+1

Versuchen Sie dies: 'df $ nRow <- sapply (df $ data, nrow)' stattdessen. Du brauchst das eine Zelle nach der anderen. Kann nicht auf der ganzen Spalte von Datenrahmen "now" machen. – Gopala

Antwort

1

Kombination dplyr und purrr Sie tun können:

library(tidyverse) 

df %>% 
    mutate(n = map_dbl(data, nrow)) 
#> # A tibble: 2 × 3 
#>  A    data  n 
#> <dbl>   <list> <dbl> 
#> 1  1 <tibble [5 × 1]>  5 
#> 2  2 <tibble [4 × 1]>  4 

Ich mag diesen Ansatz, da Sie in Ihren gewohnten Arbeitsablauf bleiben, um eine neue Spalte innerhalb mutieren zu schaffen, sondern die map_* -Familie nutzen, da Sie arbeiten müssen auf einer Liste.

0

Mit dplyr:

df %>% 
    group_by(A) %>% 
    mutate(N = nrow(data.frame(data))) 
 A    data  N 
    <dbl>   <list> <int> 
1  1 <tibble [5 × 1]>  5 
2  2 <tibble [4 × 1]>  4 
1

könnten Sie tun:

df %>% 
    rowwise() %>% 
    mutate(N = nrow(data)) 

Welche gibt:

#Source: local data frame [2 x 3] 
#Groups: <by row> 
# 
## A tibble: 2 × 3 
#  A    data  N 
# <dbl>   <list> <int> 
#1  1 <tibble [5 × 1]>  5 
#2  2 <tibble [4 × 1]>  4 
+1

Sehr schöne Lösung innerhalb der "dplyr" -Lösung im Vergleich zu der "apply" -Familie, die ich oben erwähnt habe. Ich mag das sehr. – Gopala