我有十个数据集,每个数据集包含"评级"和"职业"列。从这十个数据集中的每一个,我想找出"平均值" "评级"每三个职业群体(即艺术家,技师,市场营销)。
我写的代码如下:
// 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%)
答案 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