我真的需要您的帮助。我有一个面板数据框,看起来像这样
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
,并且我想创建一个虚拟变量,其值是1,如果(条件1)在A列中观察未显示2014年日期,或者(条件2)如果在B列中观察显示2015年日期,并且,与此同时,至少对该个人有另一个观察结果,但在A列中没有一个与2014年日期相关联。换句话说,我不知道该如何为假人施加条件来检查所有与同一个人有关的其他观察结果(在“名称”列中标识)。我想要的结果是这样的
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年日期(条件1未得到验证),第一次观察时的虚拟值是0。在第二次观察中,该假人取值为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的观察结果。
我希望它不要太扭曲,我表达了我的想法。让我知道是否不清楚。除了条件本身之外,如果您仅通过在与同一个人相关的不同观察结果之间施加条件的方式对我有所帮助,那将大有帮助。
谢谢大家! 马可
structure(list(Name = c("Marco", "Marco", "Marco", "Luca", "Luca", "Silvia"), A = structure(c(1409529600, NA, 1420156800, 1420070400, NA, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), B = structure(c(NA, 1420070400, NA, NA, 1422662400, 1421280000), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
答案 0 :(得分:0)
您可以从年份开始使用库润滑和功能,以从日期开始接收年份。另请注意,如果NA在if条件中给出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)
答案 1 :(得分:0)
NA
有点棘手,但这是一种直接方法,将隐含条件“ A不是NA
”添加到第一种情况。使用%in%
代替==
可以解决其他NA
问题,因为1 %in% NA
是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