列表:使用列表的子列表

时间:2017-11-24 09:14:54

标签: r list

我有一个像这样的列表(实际上非​​常大)

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的新手,如果可以的话,我会非常感谢您的解释!

2 个答案:

答案 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将包含:

enter image description here

答案 1 :(得分:0)

此解决方案正在使用包dplyrpurrrtidyrggplot2(用于绘图目的)。

# 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)以及计算信息(列MEANSPLOTS)创建(新)数据框。下一步是将新信息保存在单独的文件中,如上所述:

# 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的(原始)属性等等。