Как рекурсивно добавить текст в вывод данных из lapply? - PullRequest
0 голосов
/ 22 мая 2019

Я пишу небольшой фрагмент кода, который берет два разных фрейма данных и сравнивает содержимое каждого из них. Как получить доступ к отдельным строкам во фрейме данных при использовании lapply?

Я пытался использовать вложенные циклы for для доступа к индексам. Однако набор данных очень большой и занимает очень много времени.

for (i in 1:20){
for(j in 1:nrow(keyFile)){
        consolFile[i,46] <- 
ifelse(str_detect(toString(consolFile[i,47]),toString(keyFile[j,1])),append(toString(consolFile[i,46]),paste(";",toString(keyFile[j,1]))),append(toString(consolFile[i,46]),""))

  }

}

Я в основном пытаюсь добавить сопоставляемое содержимое с помощью точки с запятой и следующего сопоставленного элемента. Я слышал, что lapply / apply - более быстрые способы достижения этого. Но я не могу получить доступ к отдельным строкам, чтобы добавить данные.

Если датафрейм 1 имеет

1.abc
2.def
3.bdc

и если в кадре данных 2

1.a
2.b

вывод должен быть

1.a;b
2.
3.b

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Используется str_extract_all и тот факт, что вы можете свернуть свой вектор поиска с помощью | (т. е. поиск 'a|b'). Я оставляю несколько дополнительных столбцов, но вам будет легко получить желаемый результат.

# /8780319/kak-rekursivno-dobavit-tekst-v-vyvod-dannyh-iz-lapply

library(dplyr)
library(stringr)

tib <- tibble(x = c('abc', 'def', 'bdc'))

match_vector <- c('a','b')
paste(match_vector, collapse = '|')

tib%>%
  rowwise()%>%
  mutate(matches = str_extract_all(x, 'a|b') #could use match_vector and collapse here
         ,matches2 = paste(matches, collapse = ';'))%>%
  ungroup()

# A tibble: 3 x 3
  x     matches   matches2
  <chr> <list>    <chr>   
1 abc   <chr [2]> a;b     
2 def   <chr [0]> ""      
3 bdc   <chr [1]> b 
0 голосов
/ 22 мая 2019

Не уверен, что у меня есть исчерпывающее решение проблемы добавления результатов, но вот что я получил:

library(tidyverse)

df1 <- data.frame(words = c("abc", "def", "bdc"), stringsAsFactors = F) 
df2 <- data.frame(var1 = c("a", "b"), stringsAsFactors = F) 



map(1:nrow(df2), function(x) str_extract(df1[,1], df2[x,1])) %>%
  pmap(paste, sep = ";") %>%
  map(str_remove_all, "NA;|;NA|NA") %>%
  do.call("rbind", .) %>%
  cbind(df1, "matches" = .)

  words matches
1   abc     a;b
2   def        
3   bdc       b

purrr::map``` is almost the same as lapply () `, вы можете обменять его в этом случае.

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