Проблема с ключевым словом mutate и функциями в R - PullRequest
0 голосов
/ 03 мая 2020

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

output1 <- mytibble %>% 
  mutate(newfield = FND(mytibble$ndoc)) 
output1

Где функция FND - это ФИЛЬТР, применяемый к большому файлу (5 ГБ):

FND <- function(n){
  result <- LARGETIBBLE %>% filter(LARGETIBBLE$id == n)
  return(paste(unique(result$somefield),collapse=" "))
}

Я хочу выполнить функцию FND для каждой строки output1 tibble, но это просто выполняется один раз.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Никогда не используйте $ в dplyr трубах, очень редко они используются. Вы можете изменить свою FND функцию на:

library(dplyr)

FND <- function(n){
   LARGETIBBLE %>% filter(id == n) %>% pull(somefield)  %>% 
                  unique %>% paste(collapse = " ")
}

Теперь примените эту функцию к каждому ndoc значению в mytibble.

mytibble %>% mutate(newfield = purrr::map_chr(ndoc, FND))

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

mytibble$newfield <- sapply(mytibble$ndoc, FND)
0 голосов
/ 03 мая 2020

FND(mytibble$ndoc) больше подходит для фреймов данных. Когда вы используете такие функции, как mutate для таблицы, нет необходимости указывать имя таблицы, только имя столбца. Символы %>% уже удостоверяются, что используются только данные из таблицы. Таким образом, ваш пример был бы:


output1 <- mytibble %>% 
  mutate(newfield = FND(ndoc)) 

FND <- function(n){
  result <- LARGETIBBLE %>% filter(id == n)
  return(paste(unique(result$somefield),collapse=" "))
}

Это было бы теоретически, однако я не знаю, сработает ли ваша функция FND, возможно, попробуйте, а если нет, приведите какой-нибудь практический пример с данными и что вы пытаемся достичь.

...