按组创建变量(R)

时间:2016-08-21 12:46:14

标签: r dplyr

我的数据看起来像这样:

      CPUBID MPUBID  CSEX  CMOB  CYRB  twin  twinfam
       <int>  <int> <int> <int> <int> <int>    <int>
   1     201      2     2     3  1993     0        0
   2     202      2     2    11  1994     0        0
   3     301      3     2    10  1983     1        1
   4     302      3     2    10  1983     1        1
   5     303      3     2     4  1986     0        1
   6     401      4     1     8  1980     0        0
   7     403      4     2     3  1997     0        0
   8     801      8     2     3  1976     0        0 
   9     802      8     1     5  1979     0        0
   10    803      8     2     9  1982     0        0

dput()版本:

structure(list(CPUBID = c(201L, 202L, 301L, 302L, 303L, 401L, 
403L, 801L, 802L, 803L), MPUBID = c(2L, 2L, 3L, 3L, 3L, 4L, 4L, 
8L, 8L, 8L), CSEX = c(2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L), 
    CMOB = c(3L, 11L, 10L, 10L, 4L, 8L, 3L, 3L, 5L, 9L), CYRB = c(1993L, 
    1994L, 1983L, 1983L, 1986L, 1980L, 1997L, 1976L, 1979L, 1982L
    ), twin = c(0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), twinfam = c(0L, 
    0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("CPUBID", 
"MPUBID", "CSEX", "CMOB", "CYRB", "twin", "twinfam"), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

CPUBID是个人ID,MPUBID是母亲ID,CSEX =性别,CMOB =出生月份等.Twin是二进制变量,表示个人是双胞胎。 “twinfam”是我试图创造的变量。即,如果家庭中的任何成员是双胞胎,则该二元指示符对于该家庭的所有成员具有值== 1。

我尝试使用:

df <- df %>% group_by(MPUBID) %>% 
    mutate(twinfam = as.numeric(count(twin == 1) > 0))

但这给了我错误:

 Error: no applicable method for 'group_by_' applied to an object of class "logical"

有关修复此问题的方法的建议,或者是创建所需变量的更好方法吗?感谢。

3 个答案:

答案 0 :(得分:1)

使用base R

尝试此操作
selected <- unique(df$MPUBID[with(df,twin==1)])
df$twinfam <- ifelse(df$MPUBID %in% selected,1,0)

答案 1 :(得分:1)

基地的单线

as.numeric(df$MPUBID %in% df$MPUBID[df$twin == 1])

#[1] 0 0 1 1 1 0 0 0 0 0

答案 2 :(得分:1)

我们可以使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)),按&#39; MPUBID&#39;分组,我们检查&#39; twin&#39;中是否有any值。这不是0并将该逻辑向量转换为二进制(as.integer

library(data.table)
setDT(df1)[, twinfam1 := as.integer(any(twin!=0)) , by = MPUBID]

或者使用dplyr使用相同的逻辑。

library(dplyr)
df1 %>%
  group_by(MPUBID) %>%
  mutate(twinfam = as.integer(any(twin!=0)))
#  CPUBID MPUBID  CSEX  CMOB  CYRB  twin twinfam
#    <int>  <int> <int> <int> <int> <int>   <int>
#1     201      2     2     3  1993     0       0
#2     202      2     2    11  1994     0       0
#3     301      3     2    10  1983     1       1
#4     302      3     2    10  1983     1       1
#5     303      3     2     4  1986     0       1
#6     401      4     1     8  1980     0       0
#7     403      4     2     3  1997     0       0
#8     801      8     2     3  1976     0       0
#9     802      8     1     5  1979     0       0
#10    803      8     2     9  1982     0       0