灵活的subseting data.table in R

时间:2015-09-19 16:08:58

标签: r dataframe data.table

我正在处理人口普查数据。数据集如下所示:它是由Id标识的家庭(或家庭)的集合,并且每个家庭成员都有Id.in.HH。每个家庭都有一个头。家庭中的每个实体都有relation户主[1表示头部,2表示头部配偶,3表示头部的孩子]。例如,Id == 1的家庭有4位成员Id.in.HH,范围从1到4.此家庭的头部[Id == 1 & Id.in.HH == 3]明确表示Relation.to.Head值[{1}} {1}}]。等等。 Relation.to.Head == 1有两个值[Gender1: male]。数据集来自允许男性使用一夫多妻制的国家/地区。我想添加一个计算族2: female的列。如果是一个男性头像和一个妻子[Type]的家庭,如果是一个有女性头像和一个丈夫[[{1}}]的家庭,如果是一个男性头部有几个妻子的家庭[Type := 1]。对于每个孩子,都注意到她/他母亲的Type:= 2。我想添加一个由她/他母亲的出生日期组成的专栏。我和Type:= 3合作,但是他是一名业余爱好者。

Id.In.HH

我希望它看起来像是:

data.table

我以这种方式试过@jlhoward解决方案:

Id  Id.in.HH  Relation.to.Head  Gender  Mother.Id.In.HH Birth
1   1         2                 1       NA              1950
1   2         3                 2       3               1975
1   4         3                 2       3               1980
1   3         1                 2       NA              1955
2   2         1                 1       NA              1943             
2   3         2                 2       NA              1945        
2   1         2                 2       NA              1960     
2   5         3                 1       3               1964
2   4         3                 2       1               1980        
3   2         1                 1       NA              1975      
3   3         2                 2       NA              1977    
3   1         3                 1       3               1994         

但我收到了这个错误:

Id  Id.in.HH  Relation.to.Head  Gender  Mother.Id.In.HH Birth  Type  Mom.Birth
1   1         2                 1       NA              1950   2     NA
1   2         3                 2       3               1975   2     1955
1   4         3                 2       3               1980   2     1955
1   3         1                 2       NA              1955   2     NA
2   2         1                 1       NA              1943   3     NA           
2   3         2                 2       NA              1945   3     NA 
2   1         2                 2       NA              1960   3     NA
2   5         3                 1       3               1964   3     1945
2   4         3                 2       1               1980   3     1960    
3   2         1                 1       NA              1975   1     NA         
3   3         2                 2       NA              1977   1     NA
3   1         3                 1       3               1994   1     1977 

2 个答案:

答案 0 :(得分:3)

真的有两个问题。这是第一部分。

get.type <- function(relation,gender) {
  if (sum(relation==2)>1) return(3L)
  gender[relation==1]
}
DT[,Type:=get.type(Relation.to.Head,Gender), by=Id]

使用@ PierreLafortune对第二部分的出色方法:

DT[, Mom.Birth := Birth[match(Mother.Id.In.HH, Id.in.HH)], by=Id]
DT
#     Id Id.in.HH Relation.to.Head Gender Mother.Id.In.HH Birth Type Mom.Birth
#  1:  1        1                2      1              NA  1950    2        NA
#  2:  1        2                3      2               3  1975    2      1955
#  3:  1        4                3      2               3  1980    2      1955
#  4:  1        3                1      2              NA  1955    2        NA
#  5:  2        2                1      1              NA  1943    3        NA
#  6:  2        3                2      2              NA  1945    3        NA
#  7:  2        1                2      2              NA  1960    3        NA
#  8:  2        5                3      1               3  1964    3      1945
#  9:  2        4                3      2               1  1980    3      1960
# 10:  3        2                1      1              NA  1975    1        NA
# 11:  3        3                2      2              NA  1977    1        NA
# 12:  3        1                3      1               3  1994    1      1977

答案 1 :(得分:-1)

 while(n <= a)
 { 
    f = f * n;
    // checks if n is even; 
    // n even if the remainder of the division by 2 is zero  
    if(n % 2 == 0){
        s += 1 / (float)f;
    }
    n = n + 1; 
 }