Как заполнить столбец на основе условия, используя sum () для совпадений в r - PullRequest
0 голосов
/ 24 октября 2019

У меня проблемы с заполнением столбца в зависимости от условия. Может быть, мой подход не в правильном направлении. Я не знаю. Мои условия следующие:

  • 2 "b" s и 1 "a" подряд, напишите в столбце "match" "B"
  • 2 "c" s встроку, напишите в столбце "match" "C"
  • для чего-либо еще, заполните NA

Пока я сделал следующее, но я вижу, что это не совсем точно, так как мой новыйвектор создается не из строк, а из всего столбца, и он по-прежнему не работает.

set.seed(123)
df_letters <- data.frame(basket1 = sample(letters[1:3], 5,  replace = TRUE, prob = c(0.85,0.10,0.5)),
                        basket2 = sample(letters[1:3], 5,  replace = TRUE, prob = c(0.10,0.85,0.5)),
                        basket3 = sample(letters[1:3], 5,  replace = TRUE, prob=c(0.5,0.10,0.85)),
                        stringsAsFactors = FALSE)


df_letters %>% mutate(match = ifelse(sum(as.character(as.vector(df_letters))  == "c")==2, "C", 
                                    ifelse((sum(as.character(as.vector(df_letters))  == "b")==2) & (sum(as.character(as.vector(df_letters))  == "a")==1) ,"B", NA  )))

Мой желаемый результат:

> df_letters
  basket1 basket2 basket3 match
1       a       b       b     B
2       c       b       c     C
3       a       c       a  <NA>
4       c       b       c     C
5       b       b       c  <NA>

Большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вот как этого добиться в base R:

df_letters$match <- apply(df_letters, 1, function(x) {
  count <- as.list(table(x))
  ifelse(count$a == 1 && count$b == 2, "B", ifelse(count$c == 2, "C", NA_character_))
})

Идея состоит в том, чтобы преобразовать объект table в список для доступа к счетчикам по элементам.

Выход

      basket1 basket2 basket3 match
1       a       b       b     B
2       c       b       c     C
3       a       c       a  <NA>
4       c       b       c     C
5       b       b       c  <NA>
1 голос
/ 24 октября 2019

Один dplyr параметр может быть:

df_letters %>%
 mutate(match = case_when(rowSums(select(., starts_with("basket")) == "b") == 2 & rowSums(select(., starts_with("basket")) == "a") == 1 ~ "B",
                          rowSums(select(., starts_with("basket")) == "c") == 2 ~ "C",
                          TRUE ~ NA_character_))

  basket1 basket2 basket3 match
1       a       b       b     B
2       c       b       c     C
3       a       c       a  <NA>
4       c       b       c     C
5       b       b       c  <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...