我的数据看起来像这样:
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"
有关修复此问题的方法的建议,或者是创建所需变量的更好方法吗?感谢。
答案 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