Если какая-либо строка содержит подстроку, то флаг - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть набор данных символьных переменных:

col1 = c("a","b","c")
col2 = c("a","b_a","d")
df = data.frame(col1,col2)

  col1 col2
1    a    a
2    b  b_a
3    c    d

Я хочу создать переменную a, которая помечает 1,0, если какое-либо значение в этой строке содержит подстроку «a».

  col1 col2 a
1    a    a 1
2    b  b_a 1
3    c    d 0

Моя попытка ниже.Это не совсем так, так как я считаю, что это займет TRUE, если какое-либо значение в кадре данных содержит подстроку, а не строку.

df["a"] = ifelse(any(sapply(df,function(x) str_detect(x,"a")),TRUE),1,0)

Я думал, что с оператором ifelse любые функции в операторе ifelse оценивают только df[i,], а не весь фрейм данных, где i - строка, которую он просматривает.Это не похоже на случай.

1) Как создать искомый фрейм данных?Обратите внимание, что в моем реальном наборе данных есть более 100 столбцов, поэтому нет смысла перечислять их все.

2) Почему ifelse оценивает только строку i из df, а не целую df?

Обратите внимание, что предыдущие вопросы смотрят только на одну переменную, я смотрю на все переменные, так что это не дубликат.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вы можете использовать

grepl('a', paste0(df$col1, df$col2))

Или обобщать для любого количества столбцов

grepl('a',  do.call(paste0, df))

И третий вариант, который может быть более безопасным, если вы ищете многосимвольные подстроки, а не отдельные буквы.В этом случае вы можете отказаться от использования paste, чтобы, например, поиск 'ab' в векторе c('xa', 'bx') не дал ложного срабатывания.В этой ситуации мы можем использовать:

substr = 'a'
as.logical(colSums(apply (df, 1, function(x) grepl(substr, x))))
0 голосов
/ 02 декабря 2018

1) Как создать искомый фрейм данных?

df$a <- apply(df,1,function(x) { 
  as.numeric( length(grep("a",x)) > 0) 
  })

Вывод

  col1 col2 a
1    a    a 1
2    b  b_a 1
3    c    d 0

2) Почему ifelse только оценивает строку i из df, а не весь df?

Давайте разберем это -

  1. Вывыполнение sapply(df,function(x) str_detect(x,"a")), которое даст вам это -

      col1  col2     a
    

    [1,] ИСТИНА ИСТИНА ЛОЖЬ [2,] ЛОЖЬ ИСТИНА ЛОЖЬ [3,] ЛОЖЬ ЛОЖЬ ЛОЖЬ

  2. Далее вы делаете any(sapply(df,function(x) str_detect(x,"a")),TRUE) - это то, где дела идут плохо.any не применяется по строкам, и выходные данные представляют собой единственное логическое значение.Если вам нужно применить строку функций any, то получите то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...