#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")
Вышеприведенное и экспортирует таблицу, в которой суммируется количество проданных устройств в год. В исходной таблице также есть столбец Страны, в котором указывается, в какой стране продан продукт. То, что я хочу сделать, это вставить цикл, который создает таблицу и экспортирует специально для каждой из стран и маркирует экспорт в соответствии с названием страны.
Для этого вам не нужны петли. Вы можете использовать подход 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-файлов в вашем рабочем каталоге.
Благодаря ответам, размещенным здесь, приведенный ниже код отвечает на мой вопрос:
#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 = "."))
}
Возможно, вам нужен более простой подход для получения данных в одном файле:
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")