Использование переменных длин имен столбцов в качестве списка для цикла - PullRequest
0 голосов
/ 13 июня 2019

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

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

Мой входной файл выглядит так:

aus = structure(list(X = c("John", "Frank", "Judy", "Tom", "Margaret", 
"Jane"), Sydney = c(79L, 21L, 96L, 80L, 51L, 69L), Melbourne = c(17L, 
13L, 42L, 86L, 2L, 69L), Perth = c(82L, 71L, 63L, 39L, 68L, 19L
), Adelaide = c(37L, 99L, 59L, 23L, 35L, 26L), Canberra = c(61L, 
41L, 23L, 78L, 22L, 27L), Brisbane = c(79L, 71L, 19L, 45L, 85L, 
20L)), class = "data.frame", row.names = c(NA, -6L))

И я могу получить результаты Джуди, используя следующее:


files = c("aus.csv") 

read.data = function(files)

{

  tmp = read.csv(list[i],  row.names = 1)

  Sydney = as.numeric(tmp["Judy",1])
  Melbourne = as.numeric(tmp["Judy",2])
  Perth = as.numeric(tmp["Judy",3])
  Adelaide = as.numeric(tmp["Judy",4])
  Canberra = as.numeric(tmp["Judy",5])
  Brisbane = as.numeric(tmp["Judy",6])

  results = c(list[i], Judy, Sydney, Melbourne, Perth, Adelaide, Canberra, Brisbane)
  return(results)


}

list = files
datalist = as.list(1)

for(i in 1:length(list))
{
  temp=vector()
  datalist[[i]] = try(read.data(list[i]))
  if(is.null(dim(temp)[1])){next}
}
dataframe = do.call(rbind, datalist)
colnames(dataframe) = c("report", "name", "Sydney", "Melbourne", "Perth", "Adelaide", "Canberra", "Brisbane")

Я хотел бы заменить этот раздел на некоторый код, который может искать имя (чтобы оно не было жестко запрограммировано):

  Sydney = as.numeric(tmp["Judy",1])
  Melbourne = as.numeric(tmp["Judy",2])
  Perth = as.numeric(tmp["Judy",3])
  Adelaide = as.numeric(tmp["Judy",4])
  Canberra = as.numeric(tmp["Judy",5])
  Brisbane = as.numeric(tmp["Judy",6])

  results = c(list[i], Judy, Sydney, Melbourne, Perth, Adelaide, Canberra, Brisbane)

Для жизни я не могу отработать ту петлю, которая мне нужна. Кто-нибудь может указать мне правильное направление?

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

results = structure(c("aus.csv", "Judy", "96", "42", "63", "59", "23", 
"19"), .Dim = c(1L, 8L), .Dimnames = list(NULL, c("report", "name", 
"Sydney", "Melbourne", "Perth", "Adelaide", "Canberra", "Brisbane"
)))

1 Ответ

0 голосов
/ 13 июня 2019

Надеюсь, это поможет

library(tidyverse)

results = aus %>% 
  filter(X == "Judy") %>% # filter only John
  mutate(report = "aus.csv") %>%  # include report name
  select(report, name, everything()) # reorder columns

Если вы хотите вывод в виде символа или списка, добавьте %>% unlist или %>% list в вышеуказанную цепочку.

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