我有这种形式的数据框
familyid Year memberid value
1 2000 1 5
1 2000 2 6
2 2000 1 5
3 2000 1 7
3 2000 2 8
1 2002 1 5
1 2002 2 5
2 2002 1 6
3 2002 1 7
3 2002 2 8
我想通过以下方式对其进行转换
familyid Year value_1 value_2
1 2000 5 6
2 2000 5 NA
3 2000 7 8
1 2002 5 5
2 2002 6 NA
3 2002 7 8
换句话说,我想按家庭成员和年份将obs分组,然后为每个成员ID创建一列,报告最后一列的对应值。只要该家族只有一个成员,我想在与参考家族的成员2相关联的value_2列中具有NA。
为此,我通常成功使用以下代码
setDT(df)
dfnew<-data.table::dcast(df, Year + familyid ~ memberid, value.var=c("value"))
不幸的是,这次我得到了这样的东西
familyid Year value_1 value_2
1 2000 1 1
2 2000 1 0
3 2000 1 1
1 2002 1 1
2 2002 1 0
3 2002 1 1
换句话说,只要成员存在,我就得到一个新的数据帧(由于所有族都有至少一个成员,所以inde列value_1包含全部1),无论成员不存在,无论成员“ value”中的实际值如何,我都会得到0 ”。有人知道为什么会这样吗?谢谢您的宝贵时间。
答案 0 :(得分:0)
使用tidyverse
:
library(tidyverse)
df<-read.table(text="familyid Year memberid value
1 2000 1 5
1 2000 2 6
2 2000 1 5
3 2000 1 7
3 2000 2 8
1 2002 1 5
1 2002 2 5
2 2002 1 6
3 2002 1 7
3 2002 2 8",header=T)
df%>%
group_by(familyid,Year)%>%
spread(memberid,value)%>%
arrange(Year)%>%
mutate_at(c("1", "2"),.funs = funs( ifelse(is.na(.),0,1)))
# A tibble: 6 x 4
# Groups: familyid, Year [6]
familyid Year `1` `2`
<int> <int> <dbl> <dbl>
1 1 2000 1. 1.
2 2 2000 1. 0.
3 3 2000 1. 1.
4 1 2002 1. 1.
5 2 2002 1. 0.
6 3 2002 1. 1.