首页 > 解决方案 > 根据第二个数据帧总结一个数据帧

问题描述

我有两个不同的数据框,例如 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 的 Temps 中获取每个班级和 Head 的频率。Temp1 对应 A1,Temp2 对应 A2,依此类推。因此,例如,如果我在 Temp1 中看到值 < 12(请参阅 A1 的 Head),我将计算它们。在 Temp1 中,Head 中的所有值都大于 12,因此 A1 的 No=0。对于 A2,您在 df1 中看到 11,所以我需要查看 Temp2,我看到 3 个值 (8,2,7) 小于 11,因此 A2 的 No=3 等等...

我想得到以下结果:

Class	Head	No
A1	12	0
A2	11	3
A3	10	1
A4	9	0
A5	19	1
我尝试了 map2,但我没有成功,因为 tibble 列的长度不一致。所以我想知道我们是否可以在 R 中做到这一点

标签: rdplyrtidyverse

解决方案


我们可以将第二个数据集转换为“长”格式,执行 aleft_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

推荐阅读