2016-08-21 2 views
1

Мои данные выглядит примерно так:Создание переменной группой (R)

 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 = месяц рождения и т. д. Двойник - это двоичная переменная, указывающая, что человек является близнецом. «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

Итак, для каждой переменной 'twin' как 1 вы хотите иметь вектор, имеющий' MPUBID' как 1? –

+1

используйте 'sum' вместо' count'. Ошибка исходит из 'count' в вызове' mutate', поскольку 'dplyr :: count' работает только с кадрами данных, и вы дали ему логический вектор. Это одна из ключевых проблем с трубопроводом, поскольку сужение ошибки может быть сложным в более длинных трубах. – hrbrmstr

ответ

1

Мы можем использовать data.table. Преобразуйте «data.frame» в «data.frame» в «data.table» (setDT(df1)), сгруппированный по «MPUBID», мы проверяем, есть ли значение 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 
+1

обе хорошо работаю, спасибо! – Milhouse

1

Попробуйте это с помощью base R

selected <- unique(df$MPUBID[with(df,twin==1)]) 
df$twinfam <- ifelse(df$MPUBID %in% selected,1,0) 
+0

спасибо, хорошо работает! – Milhouse

1

Один - вкладыш в базе

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

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

спасибо, хорошо работает! – Milhouse