R 如果某个特定列的变量相同,是否有方法将多个列添加到一起?

R 如果某个特定列的变量相同,是否有方法将多个列添加到一起?,r,dataframe,tibble,R,Dataframe,Tibble,我很难弄清楚如何将变量组合在一起。例如,我想平均所有candy1,其中数据列~COUNTRY为“美国”或“加拿大”或“英国”。删除/省略包含NA的所有行时(null?) 注意:我试图为数据帧执行的操作有超过2000行和140列 已经考虑过使用for循环,但还没有找到正确的方法 Candy_Hierarchy <- tribble(~COUNTRY, ~candy1, ~candy2, ~candy3, 'United States',2, 0, 1,

我很难弄清楚如何将变量组合在一起。例如,我想平均所有candy1,其中数据列~COUNTRY为“美国”或“加拿大”或“英国”。删除/省略包含NA的所有行时(null?)

注意:我试图为数据帧执行的操作有超过2000行和140列

已经考虑过使用for循环,但还没有找到正确的方法

Candy_Hierarchy <- tribble(~COUNTRY, ~candy1, ~candy2, ~candy3,
              'United States',2, 0, 1,
              'United States', 1, 2, 0,
              'United States',2, 1, 2,
              'Canada', NA, NA, NA, 
              'Canada', 2, 0, 1,
              'United Kingdom', 1, 2, 0)

Candy_Hierarchy一种解决方案:使用
tidyr::gather
将数据从“宽”格式更改为“长”格式,为变量名创建一列,为值创建一列。然后您可以通过
dplyr::group_COUNTRY和变量名,
dplyr::summary
获取平均值,并将tidyr::spread转换回宽格式

library(dplyr)
library(tidyr)

tribble(~COUNTRY, ~candy1, ~candy2, ~candy3,
              'United States',2, 0, 1,
              'United States', 1, 2, 0,
              'United States',2, 1, 2,
              'Canada', NA, NA, NA, 
              'Canada', 2, 0, 1,
              'United Kingdom', 1, 2, 0) %>% 
  gather(Var, Val, -COUNTRY) %>% 
  group_by(COUNTRY, Var) %>% 
  summarise(Mean = mean(Val, na.rm = TRUE)) %>% 
  spread(Var, Mean)
结果:

# A tibble: 3 x 4
# Groups:   COUNTRY [3]
  COUNTRY        candy1 candy2 candy3
  <chr>           <dbl>  <dbl>  <dbl>
1 Canada           2         0      1
2 United Kingdom   1         2      0
3 United States    1.67      1      1
#一个tible:3 x 4
#组别:国家[3]
国家烛光1烛光2烛光3
1加拿大2 0 1
2联合王国12 0
3美国1.67 1

这里有一种方法可以做到这一点。我们可以使用
filter\u at(vars(以(“candy”)开头)、all\u vars(is.na()
删除所有
na
的行。在
summary
操作之后,我们可以使用
bind\u rows
将这些行添加回去

library(tidyverse)

Candy_Hierarchy2 <- Candy_Hierarchy %>% rowid_to_column() 

Candy_allNA <- Candy_Hierarchy2 %>%
  filter_at(vars(starts_with("candy")), all_vars(is.na(.))) 

Candy_Hierarchy3 <- Candy_Hierarchy2 %>% 
  anti_join(Candy_allNA, by = "rowid") %>%
  group_by(COUNTRY) %>%
  summarise_at(vars(starts_with("candy")), list(~mean(., na.rm = TRUE))) %>%
  ungroup() %>%
  bind_rows(
    Candy_allNA %>% select(-rowid)
  ) %>%
  arrange(COUNTRY)

Candy_Hierarchy3
# # A tibble: 4 x 4
# COUNTRY        candy1 candy2 candy3
#   <chr>           <dbl>  <dbl>  <dbl>
# 1 Canada           2         0      1
# 2 Canada          NA        NA     NA
# 3 United Kingdom   1         2      0
# 4 United States    1.67      1      1

为什么要聚集和传播?你就不能总结一下吗?类似于
Candy\u Hierarchy%>%group\u by(COUNTRY)%>%summary\u all(funs(mean),na.rm=TRUE)
好的解决方案。但是请注意,OP希望保留包含所有
NA
的行。噢,抱歉,我必须小心,不要删除这些行。实际上,我想删除带有NA的所有行。抱歉搞混了!我已经修复了这篇文章,因此它表明我不想让NA出现在文章中。@Lattermail是的,我相信这也会起作用。@FelixChan,在这种情况下,它变得非常简单。因为您不必首先处理所有
NA
的行。我会更新我的帖子。能在这里回答吗?我似乎不能提出一个新问题。Thanks创建一个新行会涉及到变异函数吗?我正在努力寻找一种方法,将加拿大、英国和美国的总平均数包括在内
library(tidyverse)

Candy_Hierarchy2 <- Candy_Hierarchy %>% rowid_to_column() 

Candy_allNA <- Candy_Hierarchy2 %>%
  filter_at(vars(starts_with("candy")), all_vars(is.na(.))) 

Candy_Hierarchy3 <- Candy_Hierarchy2 %>% 
  anti_join(Candy_allNA, by = "rowid") %>%
  group_by(COUNTRY) %>%
  summarise_at(vars(starts_with("candy")), list(~mean(., na.rm = TRUE))) %>%
  ungroup() %>%
  bind_rows(
    Candy_allNA %>% select(-rowid)
  ) %>%
  arrange(COUNTRY)

Candy_Hierarchy3
# # A tibble: 4 x 4
# COUNTRY        candy1 candy2 candy3
#   <chr>           <dbl>  <dbl>  <dbl>
# 1 Canada           2         0      1
# 2 Canada          NA        NA     NA
# 3 United Kingdom   1         2      0
# 4 United States    1.67      1      1
Candy_Hierarchy4 <- Candy_Hierarchy %>%
  group_by(COUNTRY) %>%
  summarise_at(vars(starts_with("candy")), list(~mean(., na.rm = TRUE))) %>%
  ungroup()

Candy_Hierarchy4
# # A tibble: 3 x 4
#   COUNTRY        candy1 candy2 candy3
#   <chr>           <dbl>  <dbl>  <dbl>
# 1 Canada           2         0      1
# 2 United Kingdom   1         2      0
# 3 United States    1.67      1      1