【发布时间】:2021-06-28 15:05:23
【问题描述】:
我知道有一个类似的问题 (r aggregate dataframe: some columns unchanged, some columns aggregated),但它不能满足我的需要。
我有一个数据框,其中包含不同物种的观察结果,但许多观察结果来自同一点(相同的经度和纬度)。
df=data.frame(sampleID=c("a","b","c","d","e","f"),latitude=c(46.4,46.4,73.2,36.6,36.6,55.3), longitud=c(66.4,66.4,34.6,46.4,46.4,50.7), material=c("soil","soil","water","water","water","water"), biome=c("forest", "forest", "sea","sea","sea","lake"), sp1=c(2,1,0,4,0,0),sp2=c(0,2,3,1,0,1), sp3=c(0,1,1,4,3,0))
df
sampleID latitude longitud material biome sp1 sp2 sp3
1 a 46.4 66.4 soil forest 2 0 0
2 b 46.4 66.4 soil forest 1 2 1
3 c 73.2 34.6 water sea 0 3 1
4 d 36.6 46.4 water sea 4 1 4
5 e 36.6 46.4 water sea 0 0 3
6 f 55.3 50.7 water lake 0 1 0
我想对来自相同位置和相同类型材料的观察结果(列 sp1、sp2 和 sp3,在提供的示例中)求和,但其他列保持不变。在“生物群系”的情况下,它应该是相同的值,所以就一样,在样本 ID 的情况下,保留一个 ID。比如:
sampleID latitude longitud material biome sp1 sp2 sp3
1 a 46.4 66.4 soil forest 3 2 1
3 c 73.2 34.6 water sea 0 3 1
4 d 36.6 46.4 water sea 4 1 7
6 f 55.3 50.7 water lake 0 1 0
我尝试过使用聚合、ddply 以及 data.table 和 lapply。但我不知道如何将 sum 函数仅应用于一组列(6:8),因此它失败了。聚合给了我一个错误,ddply 删除了它无法求和的其他列(ID 和生物群系)。并且它根据纬度对观察结果进行排序,因此找出每个 ID 是一团糟。
我尝试过的一些事情:
ddply(df, .(latitude, longitude, material), numcolwise(sum)) #This one deletes the columns which it cannot sum, ID and biome (and many other variables I haven't shown in this example)
aggregate(.~latitude+longitude+material,data=df,sum) #Gives an error
aggregate(cbind(df[,c(6:8)]) ~ as[,c(2,3,4)], data=df, sum) #Gives an error
另外,这是我拥有的数据框的简化版本,我有更多变量和 200 多个物种,每个物种都有其拉丁语的实际名称。我不能全部输入,我需要通过 df[,c(18:220)] 或类似的方式进行选择。
任何帮助将不胜感激。
【问题讨论】:
标签: r