我对此有点新意,所以我会尽量让它变得清晰。
我有一个由5个向量组成的数据框。第一个包含国家/地区名称,另外5个是来自调查的值。每行代表某人对所述调查给出的答案。
Country V1 V2 V3 V4 V5
Canada 1 2 4 1 2
Canada 1 3 2 2 3
Switzerland 3 1 1 1 1
Switzerland 1 4 3 4 2
我想创建一个代码,汇总调查问题的结果,然后计算数据框中每个国家/地区的平均值,这样每个国家/地区最终只有一个值。
vAggregateCan <- (V1 + V2 + V3 + V4 + V5)/5
canValue <- mean(vAggregateCan)
我想最终得到一个新的数据框,其中只包含我的初始数据框中每个国家/地区的一个条目,该条目与我作为示例显示的代码所产生的值相关联。这应该是这样的。
Country Value
Canada canValue
Switzerland swissValue
问题是,我不知道如何告诉R只汇总特定国家/地区的值,我想尽可能简单地找到一种方法来执行该操作,而无需重复相同的操作。结束了。
就像我说的那样,我有点新鲜,而且我不确定我的问题是否清楚。谢谢你的帮助。
答案 0 :(得分:1)
由于您要执行多项操作,因此链接不是完全相同的。我们将1)找到每个国家的平均值,2)找到每行的平均值。最直接的方法是使用base
函数。
df2 <- aggregate(. ~ Country, data=df1, mean)
data.frame(Country=df2$Country, Mean=rowMeans(df2[-1]))
# Country Mean
# 1 Canada 2.1
# 2 Switzerland 2.1
data.table
和dplyr
软件包可以运行,但是它们需要额外的环节才能跳过,因为它们的构建是为了最好地按列工作。 See this explanation for more on why row-wise operations are discouraged。
但是如果你需要使用这些包:
library(data.table)
setDT(df1)[, .(Mean = rowMeans(.SD)), by=Country][, .(Mean=mean(Mean)), by=Country]
# Country Mean
# 1: Canada 2.1
# 2: Switzerland 2.1
library(dplyr)
df1 %>% group_by(Country) %>%
summarise_all(mean, na.rm=TRUE) %>%
rowwise() %>% do(data.frame(Country=.$Country, Mean=rowMeans(.[,-1])))
# Country Mean
# 1 Canada 2.1
# 2 Switzerland 2.1
答案 1 :(得分:-1)
df <- data.frame(v1, v2, v3, v4, v5)
means <- apply(df, 1, mean)
您可以使用data.frame()
功能创建数据框,我建议使用dplyr的data_frame()
。 apply()
函数允许您在任一行上使用函数(将第二个参数设置为1)或列(将第二个参数设置为2),然后将您想要的函数用作第三个参数。
答案 2 :(得分:-1)
rowMeans函数可以提供一组行方式,然后tapply
可以在这些国家/地区值中聚合:
tapply( rowMeans(df[-1]), df[['Country']], mean)
Canada Switzerland
2.1 2.1
如果您需要索引该对象以提取单个值,则:
tapply( rowMeans(df[-1]), df[['Country']], mean)['Canada']
Canada
2.1