R中十个矩阵的重复动作

时间:2016-10-28 15:16:52

标签: r matrix apply

我有十个数据集,每个数据集包含"评级"和"职业"列。从这十个数据集中的每一个,我想找出"平均值" "评级"每三个职业群体(即艺术家,技师,市场营销)。

我写的代码如下:

// impure
var impureSquared = function (list) {
  for (var i = 0; i < list.length; i++) {
    list[i] = list[i] * list[i];
  }
}

// pure
var pureSquared = function (list) {
  return list.map(function (item) {
     return item * item;
  }
}

这显然效率不高,因为对于十个数据集,我必须再次重写相同的代码9次,以获得我的所有十个数据集中每个职业组的平均评级。有一个更好的方法吗?我想不出更好的事情!我发现apply / lapply可以成为一种方法,但我无法弄清楚它们如何适用于我的情况。

Two of my datasets (e1 and e2) can be found here.(我只包含了每个观察结果的10%)

3 个答案:

答案 0 :(得分:1)

您可以使用tidyverse包来汇总每个数据框。首先,您需要将它们放在列表中。然后,您可以迭代列表中的每个数据框,按职业进行总结:

library(tidyverse)

# Create sample data
set.seed(2353)

sample_data <- rerun(10, tibble(
  occupation = sample(c("Artist", "Technician", "Marketing"), 100, replace = TRUE),
  ratings    = sample(1:100, 100, replace = TRUE)
))

# Summarize by occupation
summarized_data <- sample_data %>% 
  map(~ .x %>% group_by(occupation) %>% summarize(avg_rating = mean(ratings)))

答案 1 :(得分:1)

另一种选择,有基础。首先将文件加载到列表中,然后使用lapply计算每个数据集的均值

# Set directory to a file that contains the files
files <- list.files()

# Load all the data at once into a single list
l <- lapply(files, dget)
names(l) <- substr(files, 1, 2) # gives meaningful names to list elements (datasets)

# Calculate the mean by group for each dataset
all_group_means <- lapply(l, function(x) tapply(x$rating, x$occupation, mean, na.rm = TRUE))

# Subset all the group means to just those you're interested in
sapply(all_group_means, function(x) x[c("artist", "technician", "marketing")])

                 d1       d2
artist     3.540984 3.612048
technician 3.519512 3.651106
marketing  3.147208 3.342569

请注意,如果您的数据已经全部加载,您可以将它们放入列表中(而不是将所有数据直接加载到列表中),然后使用lapply函数,它仍然可以正常工作。 / p>

修改

我刚刚意识到你只想要三组的手段。我已经编辑了上面的代码,将所有方法仅限于三个组。

答案 2 :(得分:0)

我建议使用“plyr”包来进行这种操作;学习一个小时左右的投资是值得的。在您的情况下,我在“d1”中加载了您的第一个示例数据集,我可以这样总结:

ddply(d1, .(occupation), summarise, mean_rating=mean(rating))

这会显示所有职业的结果,而您只需要特定的三个职业,因此我们可以将其过滤为:

ddply(subset(d1, occupation %in% c('artist','technician','marketing')), summarise, mean_rating=mean(rating))

现在我们只需要将其概括为运行超过10个数据集而无需剪切和粘贴。让我们将数据框存储在列表中:

dataset_list <- list(d1=d1) # you would put all of them here; I just have one

现在我们可以使用lapply在所有这些代码上运行相同的代码,然后返回一个列表:

filtered_occupations <- c('artist','technician','marketing')
lapply(dataset_list, function(dataset) {
    ddply(subset(dataset,occupation %in% filtered_occupations), 
    .(occupation), summarise, mean_rating=mean(rating))} )

结果:

$d1
  occupation mean_rating
1     artist    3.540984
2  marketing    3.147208
3 technician    3.519512