dcast报告1或0,而不是实际值

时间:2018-10-17 11:10:33

标签: r

我有这种形式的数据框

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 ”。有人知道为什么会这样吗?谢谢您的宝贵时间。

1 个答案:

答案 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.