使用聚合命名新列的问题

时间:2013-12-08 19:30:32

标签: r

出于某种原因,aggregate给了我错误的列名,即使数据仍然正确。谁能告诉我为什么(我做错了什么)?

例如,使用数据框df

df <- structure(list(Site = c(1L, 1L, 1L, 2L, 2L, 2L), Sample = c(1L, 
2L, 3L, 1L, 2L, 3L), Diameter = 1:6), .Names = c("Site", "Sample", 
"Diameter"), class = "data.frame", row.names = c(NA, -6L))

看起来像

    Site Sample Diameter
1    1      1        1
2    1      2        2
3    1      3        3
4    2      1        4
5    2      2        5
6    2      3        6

我运行以下代码

# Add column to calculate area from diameter
df['Area'] = ((df['Diameter']/2)^2)*pi

# Subset sites
Site1 <- subset(df, Site == "1")

# Calculate total area for each site
Site1_area <- aggregate(Site1$Area, by=list(Sample=Site1$Sample), sum, na.rm=TRUE)

Site1_area

这会将新数据框Site1_area设为

    Sample  Diameter
1      1 0.7853982
2      2 3.1415927
3      3 7.0685835

已保留计算区域,但现在列名称错误地显示为Diameter而不是Area。我知道我可以使用

重命名
colnames(Site1_area) <- c("Sample", "Area")

但我觉得这个列没有正确命名,这似乎很奇怪。谁能告诉我为什么?我做错了吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

你犯了一个错误,当你这样做时没有抓到:

df['Area'] = ((df['Diameter']/2)^2)*pi

应该是:

df[['Area']] = ((df[['Diameter']]/2)^2)*pi

在你这样做之后你有:

> df
  Site Sample Diameter   Diameter
1    1      1        1  0.7853982
2    1      2        2  3.1415927
3    1      3        3  7.0685835
4    2      1        4 12.5663706
5    2      2        5 19.6349541
6    2      3        6 28.2743339

所以你从未真正拥有一个名为“Area”的列。如果您希望标签简单,请尝试使用aggregate.formula方法:

Site1_area2 <- aggregate(Area~Sample, data=Site1, sum, na.rm=TRUE)
> Site1_area2
  Sample      Area
1      1 0.7853982
2      2 3.1415927
3      3 7.0685835