【问题标题】:Summarise a data frame according a second data frame根据第二个数据帧总结一个数据帧
【发布时间】:2020-01-29 18:08:42
【问题描述】:

我有两个不同的数据框,例如 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 中看到值

我想得到以下结果:

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

【问题讨论】:

  • 在您的帖子中,标签为dplyr/tidyverse

标签: r dplyr tidyverse


【解决方案1】:

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

【讨论】:

  • 谢谢,如何删除 Group 列,tmfmnk
  • 这里,你可以在我帖子的行后使用df1[-3]
  • 谢谢,我喜欢你的代码,简单但很专业
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多