我在R方面不是很好,而且我很难想出如何连续地做一些事情.

这是我的起始数据集:

df <- data.frame (Name  = c("Alex", "Alex", "Alex", "Alex", "Alex", "Alex", "Alex", "Beth", "Beth", "Clark"),
                  ID = c(1, 1, 2, 2, 3, 3, 3, 4, 4, 5),
                  Month = c(4, 7, 4, 6, 7, 8, 8, 1, 1, 6),
                  Day = c(5, 5, 5, 5, 8, 9, 9, 2, 2, 7),
                  Grade = c("Pass", "Fail", "Pass", "Fail", "Pass", "Pass", "Fail", "Pass", "Fail", "Pass"))

我try 做的是,对于每个唯一的Name,获取前ID行,然后过滤剩下的行,以获得NameID的组合.

所以,我想要得到的是:

Name   ID  Month  Day  Grade
Alex   1   4      5    Pass
Alex   1   7      5    Fail
Beth   4   1      2    Fail
Beth   4   1      2    Pass
Clark  5   6      7    Fail

Goal output

我try 使用GROUP_BY,提取名称和ID,然后过滤,但在%中使用%时不能过滤多个条件.这是我的代码:

df2 <- df %>% 
  group_by(Name) %>%
  group_modify(~ head(.x,1L)) %>%
  pull(Name,ID)

df3 <- df %>%
  filter(Name %in% df2, ID %in% df2)

推荐答案

如果这些数据代表您的实际数据,一种方法是在ID等于最小ID时进行筛选,同时按Name分组:

df %>%
  filter(ID == min(ID), .by = Name)

   Name ID Month Day Grade
1  Alex  1     4   5  Pass
2  Alex  1     7   5  Fail
3  Beth  4     1   2  Pass
4  Beth  4     1   2  Fail
5 Clark  5     6   7  Pass

一种稍微灵活一些的方法(即,如果ID不是升序、复杂的字符串等)是创建一个临时组ID(temp),并在Name之前使用slice_min Select 这些ID中的最小值:

library(dplyr)

df %>%
  mutate(temp = cur_group_id(), .by = c(Name, ID)) %>%
  slice_min(temp, by = Name) %>% select(-temp)

   Name ID Month Day Grade
1  Alex  1     4   5  Pass
2  Alex  1     7   5  Fail
3  Beth  4     1   2  Pass
4  Beth  4     1   2  Fail
5 Clark  5     6   7  Pass

(注意,您想要的数据中可能有一个拼写错误,因为在您的示例数据中没有Grade == "Fail"When Name == "Clark",所以它应该返回Pass)

R相关问答推荐

基于两个现有列创建新列

替换字符的所有实例,但仅限于匹配字符串中

R中的滞后累积量

了解.groups的目的= dØr的摘要功能中的删除

如何将log 2刻度上的数字转换为自然log

如何编辑ggplot的图例字使用自定义对象(gtable)?'

将嵌套列表子集化为嵌套列表

如何在ggplot中标记qqplot上的点?

从多个线性回归模型中提取系数

如何将Which()函数用于管道%>;%

KM估计的差异:SvyKm与带权重的调查

观察器中的inaliateLater的位置

将具有坐标列表列的三角形转换为多个多边形

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

计算Mean by分组和绑定到R中的数据集

如何为混合模型输出绘制不同的线型?

对R中的列表列执行ROW Mean操作

变异以按组从其他列创建具有最大和最小值的新列

如何更改包中函数中的参数?

每行不同列上的行求和