Суммируйте кадр данных согласно второму кадру данных - PullRequest
1 голос
/ 29 января 2020

У меня есть два разных фрейма данных, скажем, df1 и df2 следующим образом:

df1 <- read.table(text = " Class	Head Group
A1	12	1
A2	11	2
A3	10	1
A4	9	2
A5	10	1
", header = TRUE)

df2 <- read.table(text = " Temp1	Temp2	Temp3	Temp4	Temp5
13	13	14	11	17
13	8	19	14	15
14	2	20	15	14
15	7	9	19	9
", header = TRUE)

Я хочу получить частоты в темпах, заданные df1 для каждого класса и главы. Temp1 соответствует A1, Temp2 соответствует A2 и так далее. Так, например, если я увижу значение <12 (см. Заголовок A1) в Temp1, я буду считать их. В Temp1 все значения больше 12 в Head, поэтому No = 0 для A1. Для A2 вы видите 11 в df1, поэтому мне нужно посмотреть на Temp2, и я вижу, что 3 значения (8,2,7) меньше 11, поэтому No = 3 для A2 и так далее ... </p>

Я хочу получить следующий результат:

Class	Head	No
A1	12	0
A2	11	3
A3	10	1
A4	9	0
A5	19	1
Я пробовал map2, но мне это не удалось, так как столбцы tibble не были одинаковой длины. Поэтому мне интересно, можем ли мы сделать это в R

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Одно base R решение может быть:

df1$No <- colSums(sweep(df2, 2, FUN = "<", df1$Head))

  Class Head Group No
1    A1   12     1  0
2    A2   11     2  3
3    A3   10     1  1
4    A4    9     2  0
5    A5   10     1  1
0 голосов
/ 29 января 2020

Мы можем преобразовать второй набор данных в «длинный» формат, сделать left_join и получить счетчик для логического выражения

library(dplyr)
library(tidyr)
df2 %>%
    rename_all(~ as.character(df1$Class)) %>% 
    pivot_longer(everything(), names_to = 'Class') %>% 
    left_join(df1) %>%
    group_by(Class) %>% 
    summarise(Head = first(Head), No = sum(value < Head)) 
# A tibble: 5 x 3
#  Class  Head    No
#  <chr> <int> <int>
#1 A1       12     0
#2 A2       11     3
#3 A3       10     1
#4 A4        9     0
#5 A5       10     1

В base R мы можем повторить ' Возглавьте колонку и используйте это для сравнения

df1$No <- colSums(df2 < df1$Head[col(df2)])
df1[-3]
#  Class Head No
#1    A1   12  0
#2    A2   11  3
#3    A3   10  1
#4    A4    9  0
#5    A5   10  1
...