我想对变量进行估算,使其在每个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
而另一个是OTHERS
,我们总是使用{ {1}} / A
/ B
。因此,对于C
,我们使用id=3
代替B
。OTHERS
仅包含var1
,则它将保持为OTHERS
。OTHERS
值的id=4
,它们将保留为缺失值。因此,新数据框应如下所示:
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;
我如何纠正这个问题?
答案 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来计算OTHERS
和NA
的频率。如果您更喜欢不同的优先顺序,请相应地更改值。