Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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
dplyr:group_by,对各个列求和,并基于分组行和应用函数?_R_Dplyr_Summarize - Fatal编程技术网

dplyr:group_by,对各个列求和,并基于分组行和应用函数?

dplyr:group_by,对各个列求和,并基于分组行和应用函数?,r,dplyr,summarize,R,Dplyr,Summarize,我试图用dplyr来总结森林中鸟类物种丰富度的数据框架,这些森林在某种程度上是分散的 第一列“覆盖率”有4个可能的值:10、25、50、75。然后有十列鸟类物种计数:“物种1”到“物种10” 我想按覆盖率分组,然后对其他列求和,并将这些总和计算为4行总和的百分比 要获得列总和非常容易: %>%分组依据(覆盖率)%>%总结(变量(包含(“物种”)),总和) …但我需要的是sum/rowSum*100。似乎需要某种“按行”操作 此外,出于兴趣,为什么以下方法不起作用 %>%分组依据(覆盖率)%

我试图用dplyr来总结森林中鸟类物种丰富度的数据框架,这些森林在某种程度上是分散的

第一列“覆盖率”有4个可能的值:10、25、50、75。然后有十列鸟类物种计数:“物种1”到“物种10”

我想按覆盖率分组,然后对其他列求和,并将这些总和计算为4行总和的百分比

要获得列总和非常容易:


%>%分组依据(覆盖率)%>%总结(变量(包含(“物种”)),总和)


…但我需要的是sum/rowSum*100。似乎需要某种“按行”操作

此外,出于兴趣,为什么以下方法不起作用


%>%分组依据(覆盖率)%>%总结(变量(包含(“物种”)),总和*100)



此时,很容易回到“for”循环…或Excel数据透视表。

要使用
dplyr
,请尝试以下操作:

library(dplyr)

df %>% 
  group_by(Percent_cover) %>% 
  summarise(across(contains("species"), sum)) %>%
  mutate(rs = rowSums(select(., contains("species")))) %>%
  mutate(across(contains('species'), ~./rs * 100)) -> result

result
例如,使用mtcars:

mtcars %>%
  group_by(cyl) %>%
  summarise(across(disp:wt, sum)) %>%
  mutate(rs = rowSums(select(., disp:wt))) %>%
  mutate(across(disp:wt, ~./rs * 100))

#   cyl  disp    hp  drat    wt    rs
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     4  54.2  42.6 2.10  1.18  2135.
#2     6  58.7  39.2 1.15  0.998 2186.
#3     8  62.0  36.7 0.567 0.702 7974.
mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
总结(跨越(显示:重量,总和))%>%
变异(rs=行和(选择(,显示:wt))%>%
突变(跨越(显示:重量,~./rs*100))
#气缸显示hp drat wt rs
#       
#1     4  54.2  42.6 2.10  1.18  2135.
#2     6  58.7  39.2 1.15  0.998 2186.
#3     8  62.0  36.7 0.567 0.702 7974.

要使用
dplyr
,请尝试以下操作:

library(dplyr)

df %>% 
  group_by(Percent_cover) %>% 
  summarise(across(contains("species"), sum)) %>%
  mutate(rs = rowSums(select(., contains("species")))) %>%
  mutate(across(contains('species'), ~./rs * 100)) -> result

result
例如,使用mtcars:

mtcars %>%
  group_by(cyl) %>%
  summarise(across(disp:wt, sum)) %>%
  mutate(rs = rowSums(select(., disp:wt))) %>%
  mutate(across(disp:wt, ~./rs * 100))

#   cyl  disp    hp  drat    wt    rs
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     4  54.2  42.6 2.10  1.18  2135.
#2     6  58.7  39.2 1.15  0.998 2186.
#3     8  62.0  36.7 0.567 0.702 7974.
mtcars%>%
组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别组别
总结(跨越(显示:重量,总和))%>%
变异(rs=行和(选择(,显示:wt))%>%
突变(跨越(显示:重量,~./rs*100))
#气缸显示hp drat wt rs
#       
#1     4  54.2  42.6 2.10  1.18  2135.
#2     6  58.7  39.2 1.15  0.998 2186.
#3     8  62.0  36.7 0.567 0.702 7974.

非常好的Ronak。为了清晰起见,是否值得在最后的
中添加
.names=“{col}\u percent”
。但是,它会保持原始列的原样,并用这些新名称创建一个新列。是的,如果跨
有一个选项可以覆盖原始列而不必保持其名称不变,那就太好了。非常好的Ronak。为了清晰起见,是否值得在最后的
中添加
.names=“{col}\u percent”
。但是,它将保持原始列的原样,并使用这些新名称创建一个新列。是的,如果跨
有一个选项可以覆盖原始列而不必保持其名称不变,那就太好了。