【问题标题】:Is there any short way in R to find min Max based on below data?R中是否有任何捷径可以根据以下数据找到最小最大值?
【发布时间】:2021-07-19 19:24:22
【问题描述】:

我有两个数据集。第一个是这样的:

code | name
115  | A
120  | B
125  | A
130  | C
140  | A

第二个是这样的:

code | Year
115  | 2015
140  | 2020
120  | 2017
130  | 2019
125  | 2011

基于“代码”列,我想找到每个名称的年份范围,如下所示:

code | Year | Range
115  | 2015 | 9
140  | 2020 | 9
120  | 2017 | 0
130  | 2019 | 0
125  | 2011 | 9

其实9是2020-2011

我的目标是编写一个循环次数最少的函数,以快速处理大量数据。

【问题讨论】:

  • 对不起,我不明白预期的输出,你能澄清一下吗?为什么 120 和 130 变为零?
  • 显示的两个答案都可能是正确的解决方案,但基本上这些都是有根据的猜测。请澄清您的问题。

标签: r dataframe function range


【解决方案1】:

我想你想先合并数据框:

data<-merge(df1, df2, by = 'code')

然后你想要年份列的范围,按代码分组:

library(dplyr)

data %>% group_by(name) %>% mutate(Range=diff(range(Year)))

这一切都可以在一次调用中完成:

library(dplyr)

merge(df1, df2, by = 'code')%>%
group_by(name)%>%
mutate(Range=diff(range(Year)))

   code  Year name  Range
  <dbl> <dbl> <chr> <dbl>
1   115  2015 A         9
2   140  2020 A         9
3   120  2017 B         0
4   130  2019 C         0
5   125  2011 A         9

【讨论】:

  • 感谢百万,您认为有什么方法可以在不向输出数据框添加名称的情况下做到这一点?
  • 最后只调用'%>%select(-names)'
【解决方案2】:
  1. left_join code 的数据帧
  2. group_byname
  3. 使用maxmin
df <- tribble(
~code, ~name,
115, "A",
120, "B",
125, "A",
130, "C",
140, "A")

df1 <- tribble(
~code, ~Year,
115, 2015,
140, 2020,
120, 2017,
130, 2019,
125, 2011)

df2 <- df1 %>% 
  left_join(df, by="code") %>% 
  group_by(name) %>% 
  mutate(Range = max(Year) - min(Year)) %>%
  select(-name)
df2

输出:

   code  Year name  Range
  <dbl> <dbl> <chr> <dbl>
1   115  2015 A         9
2   140  2020 A         9
3   120  2017 B         0
4   130  2019 C         0
5   125  2011 A         9

【讨论】:

  • 非常感谢,您认为有什么方法可以在不向输出数据框添加名称的情况下做到这一点?
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 2017-12-25
  • 2021-02-26
  • 2020-07-11
  • 1970-01-01
  • 2021-11-14
  • 2020-07-14
  • 1970-01-01
相关资源
最近更新 更多