R语言 基于多个条件聚合行(一列匹配,另一列不匹配)

gojuced7  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(170)

我在R中使用一个数据集,它有一个ID号(ID)、提交数据的年份(Year)、一些其他数据(与我的问题无关,但可以将它们视为“列”)以及在我们系统上注册的日期(DateR)。
这个daterR是从我使用的数据集中自动生成的,应该表示ID号出现在我们系统上的“最早”日期。
然而,由于数据如何被提取的某种问题,我无法得到修复,日期被记录为每年更新的新日期,而不仅仅是最早的日期。
因此,我的目标是创建一个脚本来重新处理数据并执行以下两项检查:
首先,它检查行并确定哪些行具有匹配的ID号。其次,它应用日期列中所有匹配ID号的“最早”日期。
下面是我正在使用的数据集示例
| 编号|识别码1|提交年份|数据|日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|小行星123|二〇一七年|一百|2017年3月22日|
| 第二章|小行星123|二〇一八年|一百|2018年3月22日|
| 三个|小行星123|二○一九年|一百|2019年3月22日|
| 四个|小行星2222|二〇一八年|一百|2018年3月22日|
| 五个|小行星2222|二○一九年|一百|2019年3月22日|
这是我希望它看起来像(我已经加粗了更改的数字清晰)
| 编号|识别码1|提交年份|数据|日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|小行星123|二〇一七年|一百|2017年3月22日|
| 第二章|小行星123|二〇一八年|一百|二零一七年三月二十二日|
| 三个|小行星123|二○一九年|一百|二零一七年三月二十二日|
| 四个|小行星2222|二〇一八年|一百|2018年3月22日|
| 五个|小行星2222|二○一九年|一百|二零一八年三月二十二日|
我为这个参考搜索的大多数参考问题要么用其他列(如If data present, replace with data from another column based on row ID)中的值替换数据,要么使用从其他 Dataframe (如Replace a value in a dataframe by using other matching IDs of another dataframe in R)中提取的替换值。
如果可能的话,我更愿意住在丹麦。
我最好先从
数据%〉% group_by(ID 1,提交年份)%〉% mutate(跨越(c(DateR),
我知道我可以使用匹配功能...但从这一点上我只是画了一个空白。
因此,我希望得到关于如何:
如果日期与ID 1值匹配,则有条件地更改日期,其次,将所有日期更改为日期列(DateR)中最早的值。
谢谢你的时间。

sf6xfgos

sf6xfgos1#

试试这个:

quux %>%
  mutate(DateR = as.Date(DateR, format = "%d-%m-%Y")) %>%
  group_by(ID1) %>%
  mutate(DateR = min(DateR)) %>%
  ungroup()
# # A tibble: 5 × 5
#     `#`   ID1 YearSubmitted  Data DateR     
#   <int> <int>         <int> <int> <date>    
# 1     1 12345          2017   100 2017-03-22
# 2     2 12345          2018   100 2017-03-22
# 3     3 12345          2019   100 2017-03-22
# 4     4 22221          2018   100 2018-03-22
# 5     5 22221          2019   100 2018-03-22

这涉及到将DateR转换为"真正的" Date类对象,其中数值比较(如min)是明确和正确的。
数据

quux <- structure(list("#" = 1:5, ID1 = c(12345L, 12345L, 12345L, 22221L, 22221L), YearSubmitted = c(2017L, 2018L, 2019L, 2018L, 2019L), Data = c(100L, 100L, 100L, 100L, 100L), DateR = c("22-03-2017", "22-03-2018", "22-03-2019", "22-03-2018", "22-03-2019")), class = "data.frame", row.names = c(NA, -5L))
hwamh0ep

hwamh0ep2#

下面是在使用arrange对年份进行排序之后使用dplyrfirst函数的类似方法:

df %>% 
  group_by(ID1) %>% 
  arrange(YearSubmitted,.by_group = TRUE) %>% 
  mutate(DateR = first(DateR))

   ID1 YearSubmitted  Data DateR     
  <int>         <int> <int> <chr>     
1 12345          2017   100 22-03-2017
2 12345          2018   100 22-03-2017
3 12345          2019   100 22-03-2017
4 22221          2018   100 22-03-2018
5 22221          2019   100 22-03-2018

相关问题