根据第二个数据帧汇总一个数据帧

时间:2020-01-29 18:08:42

标签: r dplyr tidyverse

我有两个不同的数据帧,分别是df1和df2:

adapter.notifyDataSetChanged()

我想为每个班级和班长按df1获得以Temps为单位的频率。 Temp1对应于A1,Temp2对应于A2,依此类推。因此,例如 如果在Temp1中看到值<12(请参见Head for A1),我将对其进行计数。在Temp1中,Head中的所有值都大于12,因此A1的No = 0。对于A2,您在df1中看到11,所以我需要 查看Temp2,我看到3个值(8,2,7)小于11,所以A2的No = 3,依此类推...

我想得到以下结果:

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)
我尝试了map2,但由于小标题列的长度不一致,因此无法成功。所以我想知道我们是否可以在R

2 个答案:

答案 0 :(得分:0)

我们可以将第二个数据集转换为'long'格式,执行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中,我们可以复制“ Head”列,并使用它进行比较

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

答案 1 :(得分:0)

一种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