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

标签 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. 如果 var1 具有 ABC,则我们估算 var1 出现次数最多的值。例如对于 id=1,它有两个不同的 var1 值(AB),因此我们将其估算为A 因为它出现的次数最多。也用 A 估算缺失值。
  2. 如果 var1 具有 ABC,并且两个不同的 var1 值出现的次数相同,然后我们将 var1 值估算为最新出现的值。对于id=2,它有一个B和一个C。我们用 C 来估算它,因为它对应的日期是最新的。
  3. 如果var1包含两个不同的值,其中一个是A/B/C,另一个是A/B/COTHERS,我们总是使用 A/B/C 进行插补。因此,对于 id=3,我们使用 B 而不是 OTHERS 进行估算。
  4. 如果 var1 仅包含 OTHERS,则它将保持为 OTHERS
  5. 对于没有任何 var1 值的 id=4,它们将保留为缺失值。

因此,新的数据框应如下所示:

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)]))

或将最后一行替换为 替换(var1,which(min(n)),var1[which(max(n))]))

两者都给出错误:

Error: invalid 'type' (closure) of argument"

如何纠正这个问题?

最佳答案

您可以使用 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 的频率。如果您喜欢不同的优先级顺序,请相应地更改值。

关于r - 给定同一变量值出现的次数,如何对变量进行插补?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688063/

相关文章:

r - 混合帕累托和正态斯坦模型不起作用

r - 根据条件对多列进行变异,每一列都有不同的设置

r - R 中分组数据帧中特定行号的总和列

r - 获取达到所需数量所需的天数

r - 如何计算以前出现的按日期分组的 ID?

r - R中的桑基图 - 数据准备

R:找到一个向量中没有出现在另一个向量中的每个元素并将其设置为零

r - cv.glmnet 与 glmnet 结果;衡量解释力

r - 将 chr "00:00:00"转换为日期时间 "00:00:00"

r - 如何正确使用 tryCatch() 并忽略此 rvest 函数中的 404 错误?