在面板数据帧R中生成虚拟对象
我真的需要你的帮助。我有一个面板数据框,看起来像这样在面板数据帧R中生成虚拟对象,r,R,我真的需要你的帮助。我有一个面板数据框,看起来像这样 Name A B 1 Marco 01/09/2014 NA 2 Marco NA 01/01/2015 3 Marco 02/01/2015 NA 4 Luca 01/01/20
Name A B
1 Marco 01/09/2014 NA
2 Marco NA 01/01/2015
3 Marco 02/01/2015 NA
4 Luca 01/01/2015 NA
5 Luca NA 31/01/2015
6 Silvia NA 15/01/2015
Name A B dummy
1 Marco 01/09/2014 NA 0
2 Marco NA 01/01/2015 0
3 Marco 02/01/2015 NA 1
4 Luca 01/01/2015 NA 1
5 Luca NA 31/01/2015 1
6 Silvia NA 15/01/2015 0
我想创建一个虚拟变量,取值为1,如果(条件1),在a列中,观测值不显示2014年日期,或者(条件2),如果在B列中,观测值显示2015年日期,同时,该个体至少有另一个观测值,但没有一个与a列中的2014年日期相关联。换句话说,我不知道如何对假人施加条件,以检查与同一个体(在“名称”列中标识)相关的所有其他观察结果。我想要的结果是这样的
Name A B
1 Marco 01/09/2014 NA
2 Marco NA 01/01/2015
3 Marco 02/01/2015 NA
4 Luca 01/01/2015 NA
5 Luca NA 31/01/2015
6 Silvia NA 15/01/2015
Name A B dummy
1 Marco 01/09/2014 NA 0
2 Marco NA 01/01/2015 0
3 Marco 02/01/2015 NA 1
4 Luca 01/01/2015 NA 1
5 Luca NA 31/01/2015 1
6 Silvia NA 15/01/2015 0
在上述示例中,由于A列中的2014年日期,第一次观察时假人的值为0(条件1未验证)。在第二次观察中,假人的值为0,因为尽管B列中有2015年的日期,但同一个人(Marco)在a列中至少有一次与他相关的其他观察中显示了2014年的日期(本例中为观察1)。观察结果4显示假人等于1,因为A列中的日期为2015年。观察结果5显示假人等于1,因为尽管B列中有2015年的日期,但同一个体(Luca)在a列中没有2014年的其他观察结果(观察结果4中有2015年的日期)。最后,与Silvia相关的虚拟值必须为0,因为尽管B列中有2015年的日期,但数据框中没有其他Silvia的观察结果
我希望它不是太扭曲,我表达了我的想法。如果不清楚,请告诉我。除了条件本身,如果你能帮助我,通过对同一个人的不同观察,施加条件,那已经很有帮助了
谢谢大家!!
马可
您可以使用库lubridate和函数from it year,从日期开始接收年份。另一个注意事项是,如果if条件中的NA给出了NA,这就是为什么最好将NA转换为一些值,以便在if语句中使用。代码示例如下:
library(lubridate)
Marco <- read.csv("Marcoset.csv",stringsAsFactors=F )
Marco$A[is.na(Marco$A)] <- "01/01/0001"
Marco$B[is.na(Marco$B)] <- "01/01/0001"
Marco$A <- as.Date(Marco$A, "%d/%m/%Y")
Marco$B <- as.Date(Marco$B, "%d/%m/%Y")
Obs <- Marco%>%
group_by(Name)%>%
mutate(i2014 = sign(sum(ifelse(year(A)=="2014",1,0))))%>%
filter(year(A) !="2014" & year(A)!="0001")%>%
select(Name, i2014)%>%
group_by(Name, i2014)%>%
summarise(obs=n())
Marco <- Marco%>%
left_join(Obs, by="Name")%>%
mutate(dummy= ifelse(((year(A)!="2014"& year(A)!="1")|(year(B)=="2015" & obs>=2 & i2014==0)),1,0))%>%
select(-obs, -i2014)
库(lubridate)
马可%
总结(obs=n())
马可%
左联合(Obs,by=“Name”)%%>%
变异(虚拟=ifelse((年份(A)!=“2014”和年份(A)!=“1”)|(年份(B)=“2015”和obs>=2和i2014==0)),1,0))%>%
选择(-obs,-i2014)
NA
s使问题变得有点棘手,但这里有一个直接的方法,在第一个案例中添加隐含条件“a不是NA
”。使用%
中的%代替==
有助于解决其他NA
问题,因为%NA
中的1%为FALSE
,而1==NA
为NA
dd %>% group_by(Name) %>%
mutate(dummy = as.integer((
!format(A, "%Y") %in% "2014" & !is.na(A)
) | (
format(B, "%Y") %in% "2015"
& n() > 1
& !any(format(A, "%Y") %in% "2014")
)
))
# # A tibble: 6 x 4
# # Groups: Name [3]
# Name A B dummy
# <chr> <dttm> <dttm> <int>
# 1 Marco 2014-09-01 00:00:00 NA 0
# 2 Marco NA 2015-01-01 00:00:00 0
# 3 Marco 2015-01-02 00:00:00 NA 1
# 4 Luca 2015-01-01 00:00:00 NA 1
# 5 Luca NA 2015-01-31 00:00:00 1
# 6 Silvia NA 2015-01-15 00:00:00 0
dd%>%groupby(Name)%>%
mutate(dummy=as.integer((
!格式(A,“%Y”)%in%“2014”和!is.na(A)
) | (
格式(B,“%Y”)%in%“2015”
&n()>1
&!any(格式(A,“%Y”)%在%“2014”中)
)
))
##tibble:6 x 4
##组:名称[3]
#命名一个B虚拟
#
#1 Marco 2014-09-01 00:00:00北美
#2马可·纳2015-01-01 00:00:00
#3马可2015-01-02 00:00:00北美1
#4卢卡2015-01-01 00:00:00北美1
#5卢卡纳2015-01-31 00:00:00 1
#6西尔维亚北美2015-01-15 00:00:00
如果您dput()
您的示例data.frame将非常有用,这样我们就可以从与您相同的dat类型开始。我做到了!ThanksI上传了这个简化版的dataframe,因为在完整的dataframe中还有许多其他的东西和变量,我应该在这里解释,这使得问题更加复杂。然而,如果您能设法帮助我解决我在这个非常简单的数据框架中提出的问题,我就可以处理我拥有的庞大而完整的数据集了