Создание, маркировка и экспорт таблиц с использованием цикла в R

#Some Data
Sales <- data.frame(Appliance =c( "Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio"),Country=c("USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK"), Year=c(2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016))

#Producing a table
SalesTable<-(table(Sales[, c("Appliance", "Year")]))

#Exporting the table
write.csv(SalesTable,"Table.csv")

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

0
задан 13 August 2018 в 15:58

3 ответа

Для этого вам не нужны петли. Вы можете использовать подход tidyverse, где вы можете функционировать map на ваших поднаборах данных на основе Country:

Sales <- data.frame(Appliance =c( "Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio"),
                    Country=c("USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK"), 
                    Year=c(2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016))

library(tidyverse)

Results = Sales %>%
  group_by(Country = as.character(Country)) %>%                    # for each country
  nest() %>%                                                       # nest data
  mutate(Table = map(data, ~table(.[, c("Appliance", "Year")])))   # create a table using your function

# see Results table
Results

# # A tibble: 3 x 3
#     Country data              Table      
#     <chr>   <list>            <list>     
#   1 USA     <tibble [12 x 2]> <S3: table>
#   2 Canada  <tibble [12 x 2]> <S3: table>
#   3 UK      <tibble [12 x 2]> <S3: table>

Пока вы создали таблицу (Results) , который сообщает вам, что для каждого Country вы использовали подмножество вашего набора данных (хранящегося в столбце data) для создания таблицы (хранящейся в столбце Table).

Вы можете видеть и проверять эти таблицы с помощью Results$Table (см. список) или Results$Table[[1]] и т. д., чтобы видеть каждый элемент списка.

# save tables as .csv files and use the countries as file names
map2(Results$Country, Results$Table, ~write.csv(.y, paste0(.x, ".csv")))  

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

0
ответ дан 15 August 2018 в 16:58
  • 1
    Спасибо за это, это очень хорошее решение, я буду смотреть в tidyverse больше. – Basil 14 August 2018 в 12:34

Благодаря ответам, размещенным здесь, приведенный ниже код отвечает на мой вопрос:

#Some data
Sales <- data.frame(Appliance =c( "Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio","Laptop", "TV", "Fridge","TV", "TV", "TV","Laptop", "Laptop", "Radio"),Country=c("USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK","USA","Canada","UK"), Year=c(2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016,2017,2016,2016,2017,2017,2016))

# Extract unique country from the data i.e. USA, Canada, UK
country<- unique(Sales$Country) 
for(i in 1:length(country)){ # Loop over the each country

# Extract Appliance and Year data for each country
a<-Sales[Sales$Country==country[i],c(1,3)]

#Make the table
data<-(table(a[, c("Appliance", "Year")]))

#Export the table as a CSV file, named according to each country.
write.csv(data,paste(country[i],"csv",sep = "."))
}
0
ответ дан 15 August 2018 в 16:58

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

library(dplyr)
by_coun <- Sales %>% group_by(Country,Appliance,Year)
by_couns <- by_coun %>% summarise(n = n())
ndf=data.frame(by_couns)
ndf
# > ndf
# Country Appliance Year n
# 1  Canada    Laptop 2016 2
# 2  Canada    Laptop 2017 2
# 3  Canada        TV 2016 4
# 4  Canada        TV 2017 4
# 5      UK    Fridge 2016 4
# 6      UK     Radio 2016 4
# 7      UK        TV 2016 4
# 8     USA    Laptop 2017 8
# 9     USA        TV 2017 4

library(reshape)
ndfl <- melt(ndf, id=c("Appliance","Country","Year"), preserve=FALSE)
(res=reshape1(ndfl, list(c("Country","Appliance"),"Year"), sum))
# > (res=reshape1(ndfl, list(c("Country","Appliance"),"Year"), sum))
# Country Appliance 2016 2017
# 1  Canada    Laptop    2    2
# 2  Canada        TV    4    4
# 3      UK    Fridge    4   NA
# 4      UK     Radio    4   NA
# 5      UK        TV    4   NA
# 6     USA    Laptop   NA    8
# 7     USA        TV   NA    4
write.csv(res,"Table.csv")
0
ответ дан 15 August 2018 в 16:58

Другие вопросы по тегам:

Похожие вопросы: