如果给定同一变量的值出现次数,如何对变量进行插补?

时间:2017-01-17 02:15:14

标签: r dplyr

我想对变量进行估算,使其在每个id内保持不变。那就是var1每个id只能有一个不同的值。

其中之一是根据现有变量的值出现次数以及其他一些条件来执行估算。

df_old<- read.table(header = TRUE, text = "
date       id  var1 
25/01/2016  1  A 
02/05/2016  1  A 
20/03/2016  1  B 
13/07/2016  1  NA
20/03/2016  2  B 
28/04/2016  2  C
20/03/2016  3  B 
28/04/2016  3  OTHERS
28/04/2016  3  OTHERS 
20/10/2016  4  NA 
28/11/2016  4  NA
",stringsAsFactors=FALSE)

我们专注于var1。在每个id内:

  1. 如果var1ABC,那么我们会将var1归为最多的值。例如对于id=1,它有两个不同的var1值(AB),因此我们将其归为A,因为它发生的最多。使用A也将缺少的值归为。
  2. 如果var1ABC,并且两个不同的var1值具有相同的出现次数,那么我们会将var1值与最新出现的值。对于id=2,它有一个B和一个C。我们将其归为C,因为与之对应的日期最近发生。
  3. 如果var1包含两个不同的值,其中一个是A / B / C而另一个是OTHERS,我们总是使用{ {1}} / A / B。因此,对于C,我们使用id=3代替B
  4. 如果OTHERS仅包含var1,则它将保持为OTHERS
  5. 对于没有OTHERS值的id=4,它们将保留为缺失值。
  6. 因此,新数据框应如下所示:

    var1

    我试图写出第一个案例,但我似乎无法解决它,因此无法继续其他案例。

    df_new<- read.table(header = TRUE, text = "
    date       id  var1 
    25/01/2016  1  A 
    02/05/2016  1  A 
    20/03/2016  1  A 
    13/07/2016  1  A
    20/03/2016  2  C 
    28/04/2016  2  C
    20/03/2016  3  B 
    28/04/2016  3  B
    28/04/2016  3  B 
    20/10/2016  4  NA 
    28/11/2016  4  NA
    ",stringsAsFactors=FALSE)`
    

    或替换最后一行 library(dplyr) df_old %>% group_by(id,var1) %>% mutate(n=n()) %>% group_by(id) %>% mutate(var1=if_else(n==min(n),var1[max(n)],var1[max(n)]))

    两者都有错误:

      

    错误:无效&#39;输入&#39; (闭包)论证&#34;

    我如何纠正这个问题?

1 个答案:

答案 0 :(得分:2)

您可以将tidyverse函数用作:

dft %>% 
      group_by(id, var1) %>%
      mutate(var2 = n()) %>%
      mutate(var2 = if_else(var1 == "OTHERS", as.integer(0), as.integer(var2))) %>%
      mutate( var2 = if_else( is.na(var2), as.integer(-1), as.integer(var2))) %>%
      ungroup() %>%
      group_by(id) %>%
      arrange(desc(date)) %>%
      mutate(var3 = var1[which.max(var2)]) %>%
      arrange(id) %>%
      select(date, id, var3)

给出:

Source: local data frame [11 x 3]
Groups: id [4]

         date    id  var3
        <chr> <int> <chr>
1  25/01/2016     1     A
2  20/03/2016     1     A
3  13/07/2016     1     A
4  02/05/2016     1     A
5  28/04/2016     2     C
6  20/03/2016     2     C
7  28/04/2016     3     B
8  28/04/2016     3     B
9  20/03/2016     3     B
10 28/11/2016     4  <NA>
11 20/10/2016     4  <NA>

我们使用0和-1来计算OTHERSNA的频率。如果您更喜欢不同的优先顺序,请相应地更改值。