Соответствующие строки l oop в нескольких столбцах - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть данные из открытого опроса. У меня есть таблица комментариев и таблица кодов. Таблица кодов - это набор тем или строк.

Что я пытаюсь сделать: Проверьте, существует ли слово / строка из соответствующего столбца в таблице кодов в открытом конце комментария. Добавьте новый столбец в таблице комментариев для указанной темы c и двоичный 1 или 0, чтобы указать, какие записи были помечены.

В таблице кодов имеется довольно много столбцов, они являются действующими и постоянно меняющимися, порядок столбцов и количество столбцов могут изменяться.

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

Я не могу понять, как заставить работать с функцией stringi.

Помощь очень ценится.

Вот пример набора кода, чтобы вы могли увидеть, что я пытаюсь сделать:

#Two tables codes and comments
#codes table
codes <- structure(
  list(
    Support = structure(
      c(2L, 3L, NA),
      .Label = c("",
                 "help", "questions"),
      class = "factor"
    ),
    Online = structure(
      c(1L,
        3L, 2L),
      .Label = c("activities", "discussion board", "quiz"),
      class = "factor"
    ),
    Resources = structure(
      c(3L, 2L, NA),
      .Label = c("", "pdf",
                 "textbook"),
      class = "factor"
    )
  ),
  row.names = c(NA,-3L),
  class = "data.frame"
)
#comments table
comments <- structure(
  list(
    SurveyID = structure(
      1:5,
      .Label = c("ID_1", "ID_2",
                 "ID_3", "ID_4", "ID_5"),
      class = "factor"
    ),
    Open_comments = structure(
      c(2L,
        4L, 3L, 5L, 1L),
      .Label = c(
        "I could never get the pdf to download",
        "I didn’t get the help I needed on time",
        "my questions went unanswered",
        "staying motivated to get through the textbook",
        "there wasn’t enough engagement in the discussion board"
      ),
      class = "factor"
    )
  ),
  class = "data.frame",
  row.names = c(NA,-5L)
)

#check if any words from the columns in codes table match comments

#here I am looking for a match column by column but looking for a better way - lappy?

support = paste(codes$Support, collapse = "|")
supp_stringi = stri_detect_regex(comments$Open_comments, support)
supp_grepl = grepl(pattern = support, x = comments$Open_comments)
identical(supp_stringi, supp_grepl)
comments$Support = ifelse(supp_grepl == TRUE, 1, 0)

# What I would like to do is loop through all columns in codes rather than outlining the above code for each column in codes

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

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

comments[names(codes)] <- lapply(codes, function(x) 
            +(grepl(paste0(na.omit(x), collapse = "|"), comments$Open_comments)))
comments

#  SurveyID                                          Open_comments Support Online Resources
#1     ID_1                 I didn’t get the help I needed on time       1      0         0
#2     ID_2          staying motivated to get through the textbook       0      0         1
#3     ID_3                           my questions went unanswered       1      0         0
#4     ID_4 there wasn’t enough engagement in the discussion board       0      1         0
#5     ID_5                  I could never get the pdf to download       0      0         1
1 голос
/ 22 апреля 2020

Вот подход, который использует string::stri_detect_regex() с lapply() для создания векторов TRUE = 1, FALSE = 0 в зависимости от того, находятся ли какие-либо слова в векторах Support, Online или Resources в комментарии и объединяет эти данные с комментариями.

# build data structures from OP

resultsList <- lapply(1:ncol(codes),function(x){
     y <- stri_detect_regex(comments$Open_comments,paste(codes[[x]],collapse = "|"))
     ifelse(y == TRUE,1,0)   
     })

results <- as.data.frame(do.call(cbind,resultsList))
colnames(results) <- colnames(codes)
mergedData <- cbind(comments,results)
mergedData

... и результаты.

> mergedData
  SurveyID                                          Open_comments Support Online
1     ID_1                 I didn’t get the help I needed on time       1      0
2     ID_2          staying motivated to get through the textbook       0      0
3     ID_3                           my questions went unanswered       1      0
4     ID_4 there wasn’t enough engagement in the discussion board       0      1
5     ID_5                  I could never get the pdf to download       0      0
  Resources
1         0
2         1
3         0
4         0
5         1
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...