суммировать переменные в новом фрейме данных в r - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть два фрейма данных:

Name A1 A2 A3 B1 B2 B3
banana 1 2 1 5 1 2
apple 2 0 8 9 1 5
pear 3 8 7 0 1 2

и

Name Group
A1 A
A2 A
A3 A
B1 B
B2 B
B3 B

Я хотел бы создать новый фрейм данных, в котором переменные суммируются на основе второго фрейма данных, результатэто как:

Name A B
banana 4 8
apple 10 15
pear 18 3

Как я могу сделать это в R?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Нет необходимости во втором кадре данных, вы можете получить группы из имен.

В одну сторону, используя dplyr и tidyr, предполагая, что первый кадр данных имеет имя mydata:

library(dplyr)
library(tidyr)

mydata %>% 
  gather(Var, Val, -Name) %>% 
  mutate(Group = substring(Var, 1, 1)) %>% 
  group_by(Name, Group) %>% 
  summarise(Sum = sum(Val, na.rm = TRUE)) %>% 
  spread(Group, Sum)

Результат:

  Name       A     B
  <chr>  <int> <int>
1 apple     10    15
2 banana     4     8
3 pear      18     3
0 голосов
/ 27 ноября 2018
library(dplyr)

Сначала настройте данные.

Name <- c('A1', 'A2', 'A3', 'B1', 'B2', 'B3')
banana <- c(1, 2, 1, 5, 1, 2)
apple <- c(2, 0, 8, 9, 1, 5)
pear <- c(3, 8, 7, 0, 1, 2)
Group = c('A', 'A', 'A', 'B', 'B', 'B')

a <- data.frame(Name, banana, apple, pear, stringsAsFactors = FALSE)
b <- data.frame(Name, Group, stringsAsFactors = FALSE)

Затем используйте dplyr full_join выражение:

a %>% full_join(b, by = 'Name') %>% 
  select(-Name) %>% 
  group_by(Group) %>% 
  summarize_all(sum)
0 голосов
/ 27 ноября 2018

Мы split столбец 'Name' в 'df2' группы 'в list из vector s, используем его для подстановки столбцов в' df1 ', получаем rowSums и создаемновый набор данных со столбцом «Имя» из «df1» и столбцами суммы из lapply выходных данных

df3 <- df1['Name']
df3[c('A', 'B')] <- lapply(split(df2$Name, df2$Group), function(x) rowSums(df1[x]))
df3
#    Name  A  B
#1 banana  4  8
#2  apple 10 15
#3   pear 18  3

или с tidyverse

library(tidyverse)
df2 %>%
   group_by(Group) %>% 
   summarise(val = list(reduce(df1[Name], `+`))) %>%
   mutate(Name = list(df1$Name)) %>% 
   unnest %>% 
   spread(Group, val)
# A tibble: 3 x 3
#  Name       A     B
#  <chr>  <int> <int>
#1 apple     10    15
#2 banana     4     8
#3 pear      18     3

данными

df1 <- structure(list(Name = c("banana", "apple", "pear"), A1 = 1:3, 
    A2 = c(2L, 0L, 8L), A3 = c(1L, 8L, 7L), B1 = c(5L, 9L, 0L
    ), B2 = c(1L, 1L, 1L), B3 = c(2L, 5L, 2L)),
  class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(Name = c("A1", "A2", "A3", "B1", "B2", "B3"), 
    Group = c("A", "A", "A", "B", "B", "B")), 
 class = "data.frame", row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...