Или используя ту же методологию в

у создать новый столбец в моем фрейме данных, который имеет значение ИСТИНА или ЛОЖЬ, в зависимости от того, встречается ли термин в двух указанных столбцах. Это пример данных:

AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO')
TI <- c('AMERICAN FOREIGN POLICY', 'CHINESE ATTEMPTS TO', 'BRITAIN HAS TEA')
AU <- c('AUTHOR 1', 'AUTHOR 2','AUTHOR 3')
M  <- data.frame(AB,TI,AU)

Я могу сделать это для одного столбца или другого, но я не могу понять, как сделать это для обоих. Другими словами, я не знаю, как объединить эти две строки, которые не взаимно перезаписывают друг друга.

M$China <- mapply(grepl, "CHINA|CHINESE|SINO", x=M$AB)
M$China <- mapply(grepl, "CHINA|CHINESE|SINO", x=M$TI)

Важно, чтобы я указал столбцы, я не могу выбрать весь data.frame. Я искал другие подобные вопросы, но ни один из них не подходил для моего случая, и я не смог адаптировать какие-либо существующие примеры. Это то, что имеет смысл для меня:

M$China <- mapply(grepl, "CHINA|CHINESE|SINO", x=(M$AB|M$TI)
 akrun22 дек. 2017 г., 13:45
Это вlist формат. Вы можете преобразовать его в data.frame, обернувdata.frame или назначьте его столбцамM[] <- Map(grepl, "CHINA|CHINESE|SINO", M)
 SCW22 дек. 2017 г., 13:44
Я не совсем уверен, что делает Map, но он дает этот вывод $CHINA|CHINESE|SINO [1] TRUE FALSE FALSE $ <NA> [1] FALSE TRUE FALSE $ <NA> [1] FALSE FALSE FALSE. Кажется, что он перебирает весь фрейм данных, также он не добавляет новый столбец.
 SCW22 дек. 2017 г., 13:48
В этом случае он перезаписывает значения, чего не должно быть.
 akrun22 дек. 2017 г., 13:49
Не ясно, каков ожидаемый результат
 akrun22 дек. 2017 г., 13:38
ПытатьсяMap(grepl, "CHINA|CHINESE|SINO", M)

Ответы на вопрос(2)

Если нам нужно свернуть в один вектор, используйтеMap чтобы просмотреть столбцы, применитеpattern чтобы получитьlist изlogical вектор, тоReduce это кlogical с использованием вектора|

M$China <- Reduce(`|`, Map(grepl, "CHINA|CHINESE|SINO", M))
M
#                     AB                      TI       AU China
#1 CHINAS PARTY CONGRESS AMERICAN FOREIGN POLICY AUTHOR 1  TRUE
#2    JAPAN-US RELATIONS     CHINESE ATTEMPTS TO AUTHOR 2  TRUE
#3        JAPAN TRIES TO         BRITAIN HAS TEA AUTHOR 3 FALSE

Или используя ту же методологию вtidyverse

library(tidyverse)
M %>%
   mutate_all(funs(str_detect(., "CHINA|CHINESE|SINO")))  %>% 
   reduce(`|`) %>%
   mutate(M, China = .)
Решение Вопроса

С помощью:

M$China <- !!rowSums(sapply(M[1:2], grepl, pattern = "CHINA|CHINESE|SINO"))

дает:

> M
                     AB                      TI       AU China
1 CHINAS PARTY CONGRESS AMERICAN FOREIGN POLICY AUTHOR 1  TRUE
2    JAPAN-US RELATIONS     CHINESE ATTEMPTS TO AUTHOR 2  TRUE
3        JAPAN TRIES TO         BRITAIN HAS TEA AUTHOR 3 FALSE,

Что это делает:

sapply(M[1:2], grepl, pattern = "CHINA|CHINESE|SINO") петли над двумяAB а такжеTI столбцы и выглядит ли одна из частей шаблона ("CHINA|CHINESE|SINO") настоящее.

sapply-call возвращает матрицуTRUE/FALSE ценности:

        AB    TI
[1,]  TRUE FALSE
[2,] FALSE  TRUE
[3,] FALSE FALSE

С участиемrowSums ты проверь сколькоTRUE-значения в каждой строке

Добавлением!! передrowSums вы конвертируете все значения изrowSums-вызов выше нуля доTRUE и все эрос кFALSE.
 Jaap22 дек. 2017 г., 13:55
@SCW добавил и объяснение
 SCW22 дек. 2017 г., 13:49
Спасибо вам большое!
 SCW22 дек. 2017 г., 13:47
Да, это работает! Не совсем понимаю, но я думаю, что в M [1: 2] я могу указать любой номер столбца, который я хочу, также в моем собственном data.frame, нет?
 Jaap22 дек. 2017 г., 13:48
@SCW1:2 действительно указывает позиции столбца

Ваш ответ на вопрос