2017-09-11 5 views
2

mayデータフレーム内のすべての変数の最初と最後の欠落した観測値をいつ調べるかを知りたい。 df_stats返し変数の最初と最後の不足観測を報告する

library(tidyverse) 

df <- tribble(
    ~year, ~country, ~series1, ~series2, 
    #--|--|--|---- 
    2003, "USA", NA, 5, 
    2004, "USA", NA, 6, 
    2005, "USA", NA, 7, 
    2006, "USA", 10, 8, 
    2007, "USA", NA, 4, 
    2008, "USA", NA, 10, 
    2009, "USA", 16, 12, 
    2010, "USA", 12, 8, 
    2011, "USA", 12, 13, 
    2012, "USA", 13, 10, 
    2013, "USA", 11, 5, 
    2005, "FRA", 5, NA, 
    2006, "FRA", 6, NA, 
    2007, "FRA", 5, NA, 
    2008, "FRA", 4, NA, 
    2009, "FRA", 9, NA, 
    2010, "FRA", 7, NA, 
    2011, "FRA", 14, NA, 
    2012, "FRA", 7, 11, 
    2013, "FRA", 6, 6, 
    2014, "FRA", 5, 7, 
    2015, "FRA", 4, 5 
) 

df_stats <- df %>% 
    group_by(country) %>% 
    summarize(First = min(year, na.rm = TRUE), 
      Last = max(year, na.rm = TRUE)) 

-------------------------- 
| country | First | Last | 
-------------------------- 
| FRA  | 2005 | 2015 | 
-------------------------- 
| USA  | 2003 | 2013 | 
-------------------------- 

しかし、私はseries1series2私のために別々にこれを持ってしたいと思います。

は(私の実生活の問題で、私は多くの国や多くの変数を持っています。)

だから私は取得したいと思います:

------------------------------------------------------------------------- 
| country | First.series1 | Last.series1 | First.series2 | Last.series2 | 
------------------------------------------------------------------------- 
| FRA  | 2005   | 2015   | 2012   | 2015  | 
------------------------------------------------------------------------- 
| USA  | 2006   | 2013   | 2003   | 2013  | 
------------------------------------------------------------------------- 

答えて

2

を使用してオプションで、他の回答は素晴らしいですが、あなたはtidyverseと形式のデータに固執したい場合は、指定しました以下を試してください:

library(tidyverse) 

# Put the data in a tidy format 
gathered_df <- df %>% 
    gather(key = series_no, value = val, series1:series2, na.rm = TRUE) 

# find the first and last by country and series 
sum_df <- gathered_df %>% 
    group_by(series_no, country) %>% 
    summarise(Last = max(year), 
      First = min(year)) 

# make min and max into a column, then add a label 
# Eg First:series2 
reduced_df <- sum_df %>% 
    gather(key = measurement, value = year, First:Last) %>% 
    mutate(label = factor(paste(series_no, ":", measurement))) %>% 
    group_by(label) %>% 
    select(label, year, country) 

# Put the output in a table format as you wanted 
output <- reduced_df %>% 
    spread(key = label, value = year) 
+0

@docendo discimusソリューションはより簡潔ですが、このソリューションは私が望むものに近いものです。 (シリーズが利用可能な場合、迅速な眼球運動が可能です)。しかし、バグがあります:フリップアップ最大と最小! –

+0

@ ulima2_ yikes、最小/最大のものをソートしました、ありがとう – User632716

4

ここで私はそれにアプローチしたい方法は次のとおりです。

df %>% 
    gather(series, value, starts_with("series")) %>% 
    filter(!is.na(value)) %>% 
    group_by(country, series) %>% 
    summarize(First = min(year, na.rm = TRUE), 
      Last = max(year, na.rm = TRUE)) 

# A tibble: 4 x 4 
# Groups: country [?] 
    country series First Last 
    <chr> <chr> <dbl> <dbl> 
1  FRA series1 2005 2015 
2  FRA series2 2012 2015 
3  USA series1 2006 2013 
4  USA series2 2003 2013 

基本的には、データを長形式に変換し、NAの値を除外してから、国とシリーズごとに最小/最大を計算します。 、ここで

4

は、私は少し遅れて相手にしていdata.table

library(data.table) 
dcast(melt(setDT(df), id.var = c('year', 'country'), na.rm = TRUE)[, 
    .(First = min(year, na.rm = TRUE), Last = max(year, na.rm = TRUE)), 
    .(country, variable)], country ~variable, value.var = c("First", "Last"), sep=".") 
# country First.series1 First.series2 Last.series1 Last.series2 
#1:  FRA   2005   2012   2015   2015 
#2:  USA   2006   2003   2013   2013 
関連する問題