Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据列的名称聚合列_R_Statistics_Sum_Aggregate - Fatal编程技术网

R 根据列的名称聚合列

R 根据列的名称聚合列,r,statistics,sum,aggregate,R,Statistics,Sum,Aggregate,这里是法国学生,所以我的英语不是很好,对不起 我们将包含物种及其位置的数据集转换为这些物种及其位置的相应来源 数据集有600个列,命名为U、A、W、L或E(物种起源),其中0或1(某个位置是否存在物种) 和2个带有坐标的列(对应于数据采集站) 8000多条线路,用于发现数据的每个站点 数据集的简化如下: [Longitude] [Latitude] [A][U][U][L][E][A][U] ... [+600] [1,] -5.89 35.71 0 0 1

这里是法国学生,所以我的英语不是很好,对不起

我们将包含物种及其位置的数据集转换为这些物种及其位置的相应来源

数据集有600个列,命名为U、A、W、L或E(物种起源),其中0或1(某个位置是否存在物种)

和2个带有坐标的列(对应于数据采集站)

8000多条线路,用于发现数据的每个站点

数据集的简化如下:

     [Longitude] [Latitude] [A][U][U][L][E][A][U] ... [+600]
[1,]    -5.89      35.71     0  0  1  0  0  1  1
[2,]    -5.89      35.81     0  1  0  0  0  0  1
[3,]    -5.89      36.01     1  0  0  1  1  1  0
[4,]    -5.89      36.1      0  0  0  1  0  1  0
[1,]    -5.89      36.21     1  1  1  0  0  1  1
[2,]    -5.79      35.81     1  1  0  1  0  1  0
[3,]    -5.79      35.91     0  1  0  0  0  0  1
[4,]    -5.79      36.01     1  1  0  1  0  1  0
[+8000]
我们要做的是某种条件求和,其中所有来源都被重新组合成一列,每个列的内容都被求和,如下所示:

`
   [Longitude] [Latitude]  [A][U][L][W][E]
[1,]    -5.89     35.71    12 6  5  0  13
[2,]    -5.89     35.81    5  1  8  10 20
[3,]    -5.89     36.01    1 28  3  6  2
[4,]    -5.89     36.1     4  25 0  1  11
[1,]    -5.89     36.21    9  1  9  3  5 
[2,]    -5.79     35.81    6  5  12 1  8 
[3,]    -5.79     35.91    5  2  7  15 10
[4,]    -5.79     36.01    10 3  5  12 4 
[+8000]
只有A、U、L、E、W必须求和。 经度、纬度和行数必须保持相同

我们尝试了聚合或tapply,但没有成功,但可能需要一个循环

有什么想法吗

谢谢

MacOS函数:espOri=>df-espagg=>df.agg

espagg <- aggregate(. ~ Longitude + Latitude,
                    especeOri,
                    FUN = sum)


aggregate.columns <- function(especeOri, column.names)
{
  for (column.name in column.names) {
    especeOri[[column.name]] <- rowSums(subset(espagg, select = grep(paste(column.name, ".*", sep = ""), colnames(especeOri))))
  }
  
  return(especeOri)
}

aggregate.column.names <- c("A", "U", "L", "E", "W")

espagg <- aggregate.columns(espagg, aggregate.column.names)

espagg <- subset(especeOri, select = c("Longitude", "Latitude", aggregate.column.names))

View(espagg)

google drive提供了所有数据集、一些解释和我们的脚本。


编辑:添加了一些经度和纬度值以进行说明,并提供了一个屏幕截图,以下内容应该可以完成这项工作


df这是一个使用您提供的数据的
tidyverse
解决方案

library(dplyr)
library(tidyr)

fish <- read.table("Data_fish.txt", header = T)
traits <- read.table("Data_traits.txt", header = T)

fish %>% 
  pivot_longer(-c(ID_cellule, Longitude, Latitude), names_to = "Species", values_to = "Occur") %>% 
  mutate(ID_cellule = factor(ID_cellule, levels = unique(ID_cellule))) %>% # use factor to fix the display order as-is
  left_join(traits %>% select(Species, Origin), by = "Species") %>% 
  group_by(ID_cellule, Longitude, Latitude, Origin) %>% 
  summarise(Occur = sum(Occur)) %>% 
  pivot_wider(names_from = "Origin", values_from = "Occur")
库(dplyr)
图书馆(tidyr)
鱼%
mutate(ID_celle=factor(ID_celle,levels=unique(ID_celle))%>%#使用factor按原样修复显示顺序
左联合(特征%>%选择(物种,起源),按=“物种”)%%>%
分组依据(ID单元、经度、纬度、原点)%>%
汇总(发生=总和(发生))%>%
枢轴(名称来自“原点”,值来自“发生”)
输出

# A tibble: 8,154 x 8
# Groups:   ID_cellule, Longitude, Latitude [8,154]
   ID_cellule Longitude Latitude     A     E     L     U     W
   <fct>          <dbl>    <dbl> <int> <int> <int> <int> <int>
 1 ID1            -5.89     35.7     8    10     0   178     0
 2 ID2            -5.89     35.8    11    10     0   234     0
 3 ID3            -5.89     36.0     9    11     0   195     0
 4 ID4            -5.89     36.1    12    10     0   227     0
 5 ID5            -5.89     36.2    13    17     0   268     0
 6 ID6            -5.79     35.8     9     8     0   205     0
 7 ID7            -5.79     35.9     8     9     0   168     0
 8 ID8            -5.79     36.0    11    14     0   262     0
 9 ID9            -5.79     36.1    10    10     0   193     0
10 ID10           -5.69     35.8     9    10     0   230     0
#一个tible:8154 x 8
#分组:ID_Cellle、经度、纬度[8154]
ID\U单元经度纬度A E L U W
1 ID1-5.89 35.7 8 10 0 178 0
2 ID2-5.89 35.8 11 10 0 234 0
3 ID3-5.89 36.0 9 11 0 195 0
4 ID4-5.89 36.1 12 10 0 227 0
5 ID5-5.89 36.2 13 17 0 268 0
6 ID6-5.7935.89802050
7 ID7-5.79 35.9 8 9 0 168 0
8 ID8-5.79 36.0 11 14 0 262 0
9 ID9-5.7936.1101930
10 ID10-5.69 35.8 9 10 0 230 0

如果使用
t(数据)
转换矩阵,则变量名将为行。然后,您可以
dplyr
分组,然后
汇总
。请注意,预转置数据框中的所有变量必须是数字才能执行此操作。你能用
dput(data)
粘贴一个小的数据示例吗?它不起作用,我们只想重新组合a、U、L、W、E列,保持长度和纬度相同,以及行数相同。它给了我这个我很抱歉,但是有8000+行和600+列,我不能一个接一个地这样做…好吧,看起来像我们要找的,但不幸的是cols中只有0。似乎总数不起作用,我试着寻找原因,但我找不到。结果=>我用你的函数编辑了我的帖子。我的不好,我纠正了。你的也很有效,非常感谢!我不能接受这两个答案作为解决方案,但我投了更高的票!我也对这个答案投了赞成票@user14700052您可以交叉检查我们的答案,看看两者是否产生相同的输出。我对你们两个都投了较高的票,但因为我是新用户,所以显然不算。。。
# A tibble: 8,154 x 8
# Groups:   ID_cellule, Longitude, Latitude [8,154]
   ID_cellule Longitude Latitude     A     E     L     U     W
   <fct>          <dbl>    <dbl> <int> <int> <int> <int> <int>
 1 ID1            -5.89     35.7     8    10     0   178     0
 2 ID2            -5.89     35.8    11    10     0   234     0
 3 ID3            -5.89     36.0     9    11     0   195     0
 4 ID4            -5.89     36.1    12    10     0   227     0
 5 ID5            -5.89     36.2    13    17     0   268     0
 6 ID6            -5.79     35.8     9     8     0   205     0
 7 ID7            -5.79     35.9     8     9     0   168     0
 8 ID8            -5.79     36.0    11    14     0   262     0
 9 ID9            -5.79     36.1    10    10     0   193     0
10 ID10           -5.69     35.8     9    10     0   230     0