перекодировать с помощью предложения ifelse в группах - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь настроить столбец (называемый «комбинированный»), чтобы указать объединенную информацию о владельце и главе в каждой группе (группе). В каждой группе только 1 владелец, и «Head» - это, как правило, первая строка каждой группы, которая имеет минимальное значение id. Этот объединенный столбец должен помечать «1», если идентификатор помечен как владелец, тогда остальная часть идентификатора в каждой группе будет равна 0 независимо от информации в «Head». Однако для групп, у которых нет идентификатора владельца в идентификаторах (то есть всех 0 в числе владельцев в группе), этот столбец будет принимать информацию столбца Head. Мои данные выглядят так, и последний столбец (объединенный) - это желаемый результат.

sample <- data.frame(Group = c("46005589", "46005589","46005590","46005591", "46005591","46005592","46005592","46005592", "46005593", "46005594"), ID= c("189199", "2957073", "272448", "1872092", "10374996", "1153514", "2771118","10281300", "2610301", "3564526"), Owner = c(0, 1, 1, 0, 0, 0, 1, 0, 1, 1), Head = c(1, 0, 0, 1, 0, 1, 0, 0, 1, 1), combined = c(0, 1, 1, 1, 0, 0, 1, 0, 1, 1))

    > sample
      Group       ID Owner Head combined
1  46005589   189199     0    1        0
2  46005589  2957073     1    0        1
3  46005590   272448     1    0        1
4  46005591  1872092     0    1        1
5  46005591 10374996     0    0        0
6  46005592  1153514     0    1        0
7  46005592  2771118     1    0        1
8  46005592 10281300     0    0        0
9  46005593  2610301     1    1        1
10 46005594  3564526     1    1        1

Я пробовал несколько предложений dplyr и ifelse, и, похоже, это не дало результатов того, что я хотел. Как мне перекодировать этот столбец? Благодарю.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Новый комбинированный столбец может быть создан в dplyr за два шага: сначала используйте filter(all(Owner == 0)), создав столбец, содержащий только 'Head' информацию идентификаторов, которые не содержат 'Owner', затем объедините этот столбец с Исходный кадр данных, суммируйте 1 с в этом столбце и 1 с 'Owner', чтобы получить объединенную информацию.

    library(dplyr)
    sample2 <- sample %>%
               group_by(Group) %>%
               filter(all(Owner == 0)) %>%
               mutate(Head_nullowner = ifelse(Head == 1, 1, 0))     #select all rows of IDs that do not have any owners

#merge Head_nullowner with the original dataframe by both Group and ID
sample <- merge(sample, sample2[c("Group", "ID", "Head_nullowner")], by.x = c("Group", "ID"), by.y = c("Group", "ID"), all.x = T)
sample$Head_nullowner[is.na(sample$Head_nullowner)] <- 0
sample$OwnerHead_combined = sample$Owner + sample$Head_nullowner




> sample
      Group       ID Owner Head combined Head_nullowner OwnerHead_combined
1  46005589   189199     0    1        0              0                  0
2  46005589  2957073     1    0        1              0                  1
3  46005590   272448     1    0        1              0                  1
4  46005591 10374996     0    0        0              0                  0
5  46005591  1872092     0    1        1              1                  1
6  46005592 10281300     0    0        0              0                  0
7  46005592  1153514     0    1        0              0                  0
8  46005592  2771118     1    0        1              0                  1
9  46005593  2610301     1    1        1              0                  1
10 46005594  3564526     1    1        1              0                  1
0 голосов
/ 21 января 2019

Я не думаю, что это лучший способ, но вы можете посмотреть на визуальную проверку идентификаторов со всеми 0. Вы можете сделать это с помощью rowSums и указать эти идентификаторы с помощью %in%. Вот возможное решение:

library(dplyr)
    df %>% 
  mutate_at(vars(ID,Group),funs(as.factor)) %>% 
  mutate(Combined=if_else(Owner==1,1,0),
         NewCombi=ifelse(ID== "1872092",Head,Combined))

Это дает: NewCombi - наша цель.

#      Group       ID Owner Head Combined NewCombi
#1  46005589   189199     0    1        0        0
#2  46005589  2957073     1    0        1        1
#3  46005590   272448     1    0        1        1
#4  46005591  1872092     0    1        0        1
#5  46005591 10374996     0    0        0        0
#6  46005592  1153514     0    1        0        0
#7  46005592  2771118     1    0        1        1
#8  46005592 10281300     0    0        0        0
#9  46005593  2610301     1    1        1        1
#10 46005594  3564526     1    1        1        1
...