Ошибка использования lapply для передачи переменной dataframe через пользовательскую функцию - PullRequest
1 голос
/ 26 апреля 2020

У меня есть функция, предложенная пользователем в ответ на мой предыдущий вопрос:

word_string <- function(x) {
  inds <- seq_len(nchar(x))
  start = inds[-length(inds)]
  stop = inds[-1]
  substring(x, start, stop)
}

Функция работает так, как ожидалось, и разбивает данное слово на составные части в соответствии с моими разделениями:

 word_string('microwave')
[1] "mi" "ic" "cr" "ro" "ow" "wa" "av" "ve"

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

Вот фрейм данных для иллюстрации:

word <- c("House", "Motorcar", "Boat", "Dog", "Tree", "Drink")
some_value <- c("2","100","16","999", "65","1000000")
my_df <- data.frame(word, some_value, stringsAsFactors = FALSE ) 
my_df
      word some_value
1    House          2
2 Motorcar        100
3     Boat         16
4      Dog        999
5     Tree         65
6    Drink    1000000

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

 lapply(my_df['word'], word_string)
$word
[1] "Ho" "ot" "at" ""   "Tr" "ri"

Warning message:
In seq_len(nchar(x)) : first element used of 'length.out' argument

Таким образом, вы можете видеть, что функция применяется , но он применяется так, что он оценивает каждую строку частично. Желаемый результат будет выглядеть примерно так:

[1] "ho" "ou" "us" "se
[2] "mo" "ot" "to" "or" "rc" "ca" "ar"
[3] "bo" "oa" "at"
[4] "do" "og"
[5] "tr" "re" "ee" 
[6] "dr" "ri" "in" "nk"

Любое руководство с благодарностью.

1 Ответ

2 голосов
/ 26 апреля 2020

Причина в том, что [ по-прежнему является data.frame с одним столбцом (если мы не используем ,), и поэтому здесь единица представляет собой один столбец.

str(my_df['word'])
'data.frame':   6 obs. of  1 variable:
# $ word: chr  "House" "Motorcar" "Boat" "Dog" ...

lapply зацикливается на этом столбце вместо каждого элемента в этом столбце.

W требуется либо $, либо [[

lapply(my_df[['word']], word_string)
#[[1]]
#[1] "Ho" "ou" "us" "se"

#[[2]]
#[1] "Mo" "ot" "to" "or" "rc" "ca" "ar"

#[[3]]
#[1] "Bo" "oa" "at"

#[[4]]
#[1] "Do" "og"

#[[5]]
#[1] "Tr" "re" "ee"

#[[6]]
#[1] "Dr" "ri" "in" "nk"
...