如何创建一个循环,在R中按行显示列覆盖率

时间:2016-10-28 10:02:01

标签: r loops

我目前正在开展一个项目,我们正在查看国家/地区年份的数据。这就是每个国家和年份组合都是一个独特的案例。我想创建一个遍历每个变量的循环,每年运行计数。我现在可以通过在R中使用data.table为每个单独的变量执行此操作。例如:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

有一个软件包可以帮助您查看数据集http://www.bytefold.com/generate-metadata-for-a-dataset-in-r/

的元数据

你可以尝试这个,它提供了有关你的数据集的基本信息。