我有一个像这样的列表(实际上非常大)
name attr1 attr2
supplier1 10 87
supplier1 11 88
supplier1 12 89
supplier1 13 21
supplier2 20 31
supplier2 21 75
supplier2 22 75
supplier3 30 47
supplier3 19 22
我需要与每个供应商分开合作。
我们说我需要计算平均值并为每个供应商绘制图表。 此外,让我们说我需要保存每个均值(txt文件)和每个图表(pdf / jpeg文件)和供应商的名称(我应该从列表中获取)。
我是R的新手,如果可以的话,我会非常感谢您的解释!
答案 0 :(得分:1)
我认为在这个问题上必须有一些重复。但是,由于这个问题要求为每个聚合级别创建单独的输出文件,我不确定是否容易找到欺骗。
您可以尝试按照以下建议:
library(data.table)
setDT(DF)[, lapply(.SD, mean), by = name]
name attr1 attr2 1: supplier1 11.5 71.25000 2: supplier2 21.0 60.33333 3: supplier3 24.5 34.50000
如果您需要为每个供应商提供单独的txt文件:
setDT(DF)[, fwrite(c(name = name, lapply(.SD, mean)), paste0(name, ".txt")), by = name]
为包含单个图表的每个name
创建一个文件:
library(ggplot2)
DF[, {ggplot(.SD) + aes(attr1, attr2) + geom_point() + ggtitle(name);
ggsave(paste0(name, ".png"))}, by = name]
例如,文件supplier1.png
将包含:
答案 1 :(得分:0)
此解决方案正在使用包dplyr
,purrr
,tidyr
和ggplot2
(用于绘图目的)。
# example dataset
df = read.table(text = "
name attr1 attr2
supplier1 10 87
supplier1 11 88
supplier1 12 89
supplier1 13 21
supplier2 20 31
supplier2 21 75
supplier2 22 75
supplier3 30 47
supplier3 19 22
", header=T, stringsAsFactors=F)
library(dplyr)
library(purrr)
library(tidyr)
library(ggplot2)
df %>%
group_by(name) %>% # for each supplier
nest() %>% # nest data
mutate(MEANS = map(data, ~ .x %>% summarise_all(mean)), # obtain mean of rest of columns
PLOTS = map2(data, name, # plot data and use the supplier as a title
~ggplot(data = .x) +
geom_point(aes(attr1, attr2)) +
ggtitle(.y))) -> df_upd # save this a new data frame
# # check how your new dataset looks like
df_upd
# # A tibble: 3 x 4
# name data MEANS PLOTS
# <chr> <list> <list> <list>
# 1 supplier1 <tibble [4 x 2]> <tibble [1 x 2]> <S3: gg>
# 2 supplier2 <tibble [3 x 2]> <tibble [1 x 2]> <S3: gg>
# 3 supplier3 <tibble [2 x 2]> <tibble [1 x 2]> <S3: gg>
对于每个供应商值,您有列data
(包含实际数据的数据框列表),列MEANS
(具有计算方法的数据框列表)和列PLOTS
(您的数据图表列表)。
因此,到目前为止,您已设法使用之前/原始信息(列data
)以及计算信息(列MEANS
和PLOTS
)创建(新)数据框。下一步是将新信息保存在单独的文件中,如上所述:
# save each MEANS dataset in a separate file using the corresponding name
map2(df_upd$MEANS, df_upd$name, ~ write.csv(.x, .y, row.names = F))
# save each plot separately using the corresponding name
map2(df_upd$PLOTS, df_upd$name, ~ .x + ggsave(paste0(.y, ".png")))
请注意,您可以像访问任何其他数据框一样访问此数据框的信息。例如:df_upd$MEANS
将为您提供所有计算方法的数据框列表,df_upd$MEANS[df_upd$name == "supplier2"]
将为您提供supplier2的先前信息,df_upd$data[df_upd$name == "supplier3"]
将为您提供supplier3的(原始)属性等等。