функция работает с одним элементом списка, не работает с полным списком, R - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать функцию для добавления тегов во фрейм данных. Имя фрейма данных содержит информацию, которая мне нужна (дата, выбор, обработка и т. Д.). Поэтому я сделал функцию, которая извлекает информацию, которая мне нужна. У меня есть большой список, содержащий все фреймы данных, и когда я применяю функцию к списку, он создает новые столбцы для тегов, но значения имеют NA-ы. Каждый фрейм данных имеет одинаковую структуру имени, и если я извлекаю фрейм данных из списка и запускаю функцию, он работает. Можете ли вы помочь мне выяснить, почему это не работает, когда я применяю его в список?

вот моя функция:

library(stringr)

tagging <- function(H){

  namey<-deparse(substitute(H)) #get the name of the data frame 
  namey<- str_sub(namey,1, -5) #drop the .csv 
  H$date<-substring(namey,1, 6) # get the first 6 characters containing the date 
  H$selection<- word(namey, -1) #get the last word 
  H$treatment<- word(namey, -2) # get the second last word
  H$REP<- word(namey, -3) # get the third last word 
  return(H)
  }

И я применяю это так

 ListofData.tagged<-lapply(ListofData, tagging)

Имя фрейма данных выглядит так:

180503 xyz1-6 R4_A6_xyz 5 yes.csv

1 Ответ

0 голосов
/ 16 ноября 2018

Импортируйте таким образом, чтобы сохранить ваши имена:

library(tidyverse)
ListofData <- map(set_names(temp), read_csv)

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

tagging <- function(H, namey){
  namey<- str_sub(namey,1, -5) #drop the .csv 
  H$date<-substring(namey,1, 6) # get the first 6 characters containing the date 
  H$selection<- word(namey, -1) #get the last word 
  H$treatment<- word(namey, -2) # get the second last word
  H$REP<- word(namey, -3) # get the third last word 
  return(H)
  }

Затем imap передает данные в аргумент H и имена элементов в аргумент namey.

ListofData.tagged <- imap(ListofData, tagging)

базовый перевод R

ListofData <- lapply(setNames(temp,temp), read.csv)
ListofData.tagged <- Map(tagging, ListofData, names(ListofData))

Или, если вам нет дела до именования элементов ListofData, вы можете сделать это непосредственно Map(tagging, ListofData, temp) (сохраняя новое определение tagging).

...