2017-02-01 4 views
1

Вы хотите добавить столбец, основанный на значениях двух столбцов, но более чем на одну строку.Ifelse statment для нескольких строк

Пример Dataset Код:

A = c(1,1,1,2,2,2,3,3,3,4,4) 
B = c(1,2,3,1,2,3,1,2,3,1,2) 
C = c(0,0,0,1,0,0,1,1,1,0,1) 
data <- data.frame(A,B,C) 

набора данных:

A B C 
1 1 1 0 
2 1 2 0 
3 1 3 0 
4 2 1 1 
5 2 2 0 
6 2 3 0 
7 3 1 1 
8 3 2 1 
9 3 3 1 
10 4 1 0 
11 4 2 1 

IfElse заявления:

То, что я пытаюсь достичь «Создать столбец D .Если столбец C == 1 в любой строке где столбец A == х, столбец D = 1. Else столбец D == 0"

Желаемая Выход:

A B C D 
1 1 1 0 0 
2 1 2 0 0 
3 1 3 0 0 
4 2 1 1 1 
5 2 2 0 1 
6 2 3 0 1 
7 3 1 1 1 
8 3 2 1 1 
9 3 3 1 1 
10 4 1 0 1 
11 4 2 1 1 

Что я сделал :

Я думал об этом сегодня, но не могу прийти к логическому ответу, я пробовал смотреть на данные в длинных и широких форматах, но ничего не выскочил.

Примечание: В фактическом применении количество раз х появляется в столбце C не равно (некоторые содержат одно повторение в наборе данных, другие содержат 20).

+1

Если столбец С == 1 в любой строке, где колонка А == х ???? , столбец BBBB = 1. Остальная колонка D == 0 " A = x? и D = 1? должно ли оно быть A =" некоторое число "и" B "= 1? Вам даже нужна колонка B? – Mandar

+1

Столбец A нигде не имеет «x». – Mandar

+0

@Mandar - я думаю, что они означают для каждого уникального значения в столбце 'A'. Однако это действительно неясно. – thelatemail

ответ

3
# just check using any() if any group has a single row with C==1 

library(dplyr) 
data %>% group_by(A) %>% mutate(D = as.numeric(any(C==1))) 

library(data.table) 
data[, D:=as.numeric(any(C==1)), by = .(A)] 
#  A  B  C  D 
#1  1  1  0  0 
#2  1  2  0  0 
#3  1  3  0  0 
#4  2  1  1  1 
#5  2  2  0  1 
#6  2  3  0  1 
#7  3  1  1  1 
#8  3  2  1  1 
#9  3  3  1  1 
#10  4  1  0  1 
#11  4  2  1  1 
+1

Отлично. Не нашел «никакой» функции раньше. –

0

Легко с data.table

library(data.table) 
data <- data.table(data) 
x=2 
data[,D:=ifelse(!A==x,ifelse(C==1,1,0),0)] 
data 
0

Мы можем использовать ave из base R

data$D <- with(data, as.integer(ave(C==1, A, FUN=any))) 
data 
# A B C D 
#1 1 1 0 0 
#2 1 2 0 0 
#3 1 3 0 0 
#4 2 1 1 1 
#5 2 2 0 1 
#6 2 3 0 1 
#7 3 1 1 1 
#8 3 2 1 1 
#9 3 3 1 1 
#10 4 1 0 1 
#11 4 2 1 1 
Смежные вопросы