2016-10-28 57 views
0

我目前正在研究一個項目,我們正在查看國家年格式的數據。這是每個國家和每年的組合是一個獨特的案例。我想創建一個遍歷每個變量並每年運行一次的循環。我目前可以通過在R中使用data.table爲每個單獨的變量執行此操作。例如:如何創建一個循環,顯示按行R列的行覆蓋率

DT[, list(total = sum(v_23_27 !=99999)), by = ID_year]' 

任何意見,將不勝感激。

編輯:

我找非NA情況下,爲了檢查數據集的覆蓋範圍。下面的示例數據:

Year Country Var1 Var2 
2001 Canada NA NA 
2001 USA  .32 NA 
2001 Sweden NA 1 
2002 Canada .1 NA 
2002 USA .32 1 
2002 Sweden NA 1 
+0

計數的是什麼? – ulfelder

+0

請添加數據的一個例子。 – Ansjovis86

+0

目前尚不清楚。也許你正在尋找'DT [,list(total = sum(v_23_27!= 99999)),by = list(ID_year,ID_country)]' –

回答

0

您可以使用dplyr做到這一點。這裏有一個版本,每年將數非NA每列的值:

# make toy data 
set.seed(20912) 
df <- data.frame(country = c(rep("A", 5), rep("B", 5)), 
       year = rep(seq(1995,1999), 2), 
       var1 = rnorm(10, 100, 20), 
       var2 = sample(c("lo", "hi", NA), 10, replace = TRUE), 
       stringsAsFactors = FALSE) 

library(dplyr) 

# create function for counting non-NA values 
noNAsum <- function(x) { sum(!is.na(x)) } 

# group the data by year and then apply the function to each column of interest 
df %>% 
    group_by(year) %>% 
    summarise_each(funs(noNAsum), var1:var2) 

# A tibble: 5 × 3 
    year var1 var2 
    <int> <int> <int> 
1 1995  2  1 
2 1996  2  2 
3 1997  2  0 
4 1998  2  2 
5 1999  2  2 

如果要使用不同的規則不同的列,您可以擴展調用summarize以容納,例如:

df %>% 
    group_by(year) %>% 
    summarise(var1 = sum(var1 > 100), 
      var2 = sum(!is.na(var2))) 

# A tibble: 5 × 3 
    year var1 var2 
    <int> <int> <int> 
1 1995  1  1 
2 1996  1  2 
3 1997  0  0 
4 1998  1  2 
5 1999  0  2 
+0

這很好用。感謝您的幫助。 – Joe