我想对变量进行插补,使其在每个 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
内:
- 如果
var1
具有A
、B
或C
,则我们估算var1
出现次数最多的值。例如对于id=1
,它有两个不同的var1
值(A
和B
),因此我们将其估算为A
因为它出现的次数最多。也用A
估算缺失值。 - 如果
var1
具有A
、B
或C
,并且两个不同的var1
值出现的次数相同,然后我们将var1
值估算为最新出现的值。对于id=2
,它有一个B
和一个C
。我们用C
来估算它,因为它对应的日期是最新的。 - 如果
var1
包含两个不同的值,其中一个是A
/B
/C
,另一个是A
/B
/C
是OTHERS
,我们总是使用A
/B
/C
进行插补。因此,对于id=3
,我们使用B
而不是OTHERS
进行估算。 - 如果
var1
仅包含OTHERS
,则它将保持为OTHERS
。 - 对于没有任何
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 来解释 OTHERS
和 NA
的频率。如果您喜欢不同的优先级顺序,请相应地更改值。
关于r - 给定同一变量值出现的次数,如何对变量进行插补?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688063/