Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用R按另一列有条件地选择一组中的最后N个值

使用R按另一列有条件地选择一组中的最后N个值
EN

Stack Overflow用户
提问于 2017-07-31 17:30:52
回答 4查看 713关注 0票数 0

这个问题类似于在group by列here中选择前N个值。

但是,我想按组选择最后N个值,N取决于相应计数列的值。该计数表示特定名称出现的次数。如果count >3,我只想要最后三个条目,但如果它小于3,我只想要最后一个条目。

代码语言:javascript
运行
AI代码解释
复制
# Sample data
df <- data.frame(Name = c("x","x","x","x","y","y","y","z","z"), Value = c(1,2,3,4,5,6,7,8,9))

# Obtain count for each name
count <- df %>%
  group_by(Name) %>%
  summarise(Count = n_distinct(Value))

# Merge dataframe with count
merge(df, count, by=c("Name"))

# Delete the first entry for x and the first entry for z

# Desired output
data.frame(Name = c("x","x","x","y","y","y","z"), Value = c(2,3,4,5,6,7,9))
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-31 17:40:35

在基数R中,首先用df$Name拆分df。然后,对于每个子组,检查行数,并有条件地提取最后3行或最后1行。

代码语言:javascript
运行
AI代码解释
复制
do.call(rbind, lapply(split(df, df$Name), function(a)
    a[tail(sequence(NROW(a)), c(3,1)[(NROW(a) < 3) + 1]),]))

或者

代码语言:javascript
运行
AI代码解释
复制
do.call(rbind, lapply(split(df, df$Name), function(a)
    a[tail(sequence(NROW(a)), ifelse(NROW(a) < 3, 1, 3)),]))
#    Name Value
#x.2    x     2
#x.3    x     3
#x.4    x     4
#y.5    y     5
#y.6    y     6
#y.7    y     7
#z      z     9

对于三个条件值

代码语言:javascript
运行
AI代码解释
复制
do.call(rbind, lapply(split(df, df$Name), function(a)
      a[tail(sequence(NROW(a)), ifelse(NROW(a) >= 6, 6, ifelse(NROW(a) >= 3, 3, 1))),]))
票数 2
EN

Stack Overflow用户

发布于 2017-07-31 18:21:20

另一种愚蠢的方式:

代码语言:javascript
运行
AI代码解释
复制
df %>% group_by(Name) %>% slice(tail(row_number(), 
  if (n_distinct(Value) < 3) 1 else 3
))

# A tibble: 7 x 2
# Groups:   Name [3]
    Name Value
  <fctr> <dbl>
1      x     2
2      x     3
3      x     4
4      y     5
5      y     6
6      y     7
7      z     9

data.table中的类比是...

代码语言:javascript
运行
AI代码解释
复制
library(data.table)
setDT(df)
df[, tail(.SD, if (uniqueN(Value) < 3) 1 else 3), by=Name]

在R基地最近的东西是..。

代码语言:javascript
运行
AI代码解释
复制
with(df, {
  len = tapply(Value, Name, FUN = length)
  nv  = tapply(Value, Name, FUN = function(x) length(unique(x)))
  df[ sequence(len) > rep(nv - ifelse(nv < 3, 1, 3), len), ]
})

..。这比应该的要难得多。

票数 4
EN

Stack Overflow用户

发布于 2017-07-31 18:38:27

另一种可能性是:

代码语言:javascript
运行
AI代码解释
复制
library(tidyverse)

df %>%
  split(.$Name) %>%
  map_df(~ if (n_distinct(.x) >= 3) tail(.x, 3) else tail(.x, 1))

这提供了:

代码语言:javascript
运行
AI代码解释
复制
#  Name Value
#1    x     2
#2    x     3
#3    x     4
#4    y     5
#5    y     6
#6    y     7
#7    z     9
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45422003

复制
相关文章
Excel公式练习:根据条件获取唯一的第n个值
引言:本文的练习整理自chandoo.org。多一些练习,想想自己会怎么解决这个问题,看看别人又是怎样解决的,这样能够快速提高Excel公式编写水平。
fanjy
2022/06/04
2.3K0
Excel公式练习:根据条件获取唯一的第n个值
Java中的按值传递
这个时候可能会有疑问了,为什么add方法可以修改List数组,但是append和addNum却没有修改传进来的值
俺也想起舞
2019/07/24
1.9K0
问与答81: 如何求一组数据中满足多个条件的最大值?
Q:在工作表中有一些数据,如下图1所示,我想要获取“参数3”等于“A”、”参数4“等于”C1“对应的”参数5”中的最大值,能够使用公式解决吗?
fanjy
2020/04/20
4.1K0
Java中M个元素的集合每N个分成一组通用方案
虽然这个功能非常简单,直接用for循环或者while可以写,其实可以封装成工具类,方便后续复用。
明明如月学长
2021/08/31
6470
Java中M个元素的集合每N个分成一组通用方案
Excel公式练习:根据条件获取唯一的第n个值(续)
引言:本文的练习整理自chandoo.org。多一些练习,想想自己会怎么解决这个问题,看看别人又是怎样解决的,这样能够快速提高Excel公式编写水平。
fanjy
2022/11/16
1.9K0
Excel公式练习:根据条件获取唯一的第n个值(续)
选择 GraphQL 的 N 个理由
甚至还有 GraphQl Faker 这样的工具,使得完全可以可以编码之前将 schema 全部设计好
szhshp
2022/09/21
5770
使用Python按另一个列表对子列表进行分组
在 Python 中,我们可以使用各种方法按另一个列表对子列表进行分组,例如使用字典和使用 itertools.groupby() 函数,使用嵌套列表推导。在分析大型数据集和数据分类时,按另一个列表对子列表进行分组非常有用。它还用于文本分析和自然语言处理。在本文中,我们将探讨在 Python 中按另一个列表对子列表进行分组的不同方法,并了解它们的实现。
很酷的站长
2023/08/11
5320
使用Python按另一个列表对子列表进行分组
如何使用Excel将某几列有值的标题显示到新列中
如果我们有好几列有内容,而我们希望在新列中将有内容的列的标题显示出来,那么我们怎么做呢?
繁华是客
2023/03/03
11.7K0
Java中只有按值传递,没有按引用传递!
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟悉的值传递的例子:
java达人
2018/01/31
1.2K0
Java中只有按值传递,没有按引用传递!
photoshop 使用矩形选择工具,拷贝图片至另一个图片文件中
注意:这里圈的部分是当前图层的部分,首先需要选中图层,我改动复制图片中风景的一部分,所以拷贝的是一小块风景画。
Devops海洋的渔夫
2019/06/02
1K0
windows系统下Java中:检测\r和\n对应的ASCII值的方法
windows系统下Java中:检测\r和\n对应的ASCII值的方法:使用 \r字符和\n字符 与 0 做加法
黑泽君
2018/10/11
1.8K0
linux中删除文件的最后N行小总结
实例介绍 首先准备一个rumenz.txt文件: $ cat rumenz.txt 1 rumenz.com 2 rumenz 3 入门 4 小站 5 入门小站 6 小站入门 7 门小 8 入站 9 123 10 rumenxiaozhan 如上面的输出所示,我们的rumenz.txt包含十行。 现在,假设我们要从rumenz.txt文件中删除最后三行 ( n=3 ) 。 在本教程中,我们将使用四种技术解决问题: 使用 head命令 使用 wc和sed 命令 使用 tac和sed命令 使
入门笔记
2022/06/02
7.9K0
算法创作|求任意N个整数中的最大值和最小值
解决这个问题有三种常见思路,第一种思路比较简单粗暴,就是对用户输入的每个整数两两之间进行比较,直到找到最大的整数和最小的整数为止。第二种思路是将用户输入的整数放入一个空列表中,然后利用Python内置的max()函数和min()函数分别得到最大值和最小值。第三种思路与第二种思路类似,也是将用户输入的整数放入一个空列表,然后对列表进行排序,列表下标为0的数即为最小值,列表下标为N-1的数即为最大值。接下来让我们来演示一下第三种方法:
算法与编程之美
2021/03/30
2.4K0
算法创作|求任意N个整数中的最大值和最小值
如何对N个接口按比例压测
随着微服务盛行,公司的服务端项目也越来越多。单一的接口性能测试并不能准确反映某个服务的总体处理能力,在服务功能划分比较清晰的架构下,对于某一服务的总体性能测试也相对变得简单。下面分享一个对于某个模块对应的服务的N个接口按照固定比例(来源于线上监控)进行性能测试,基于自己写的性能测试框架第二版。
FunTester
2020/01/17
5590
R中重复值、缺失值及空格值的处理
1、R中重复值的处理 unique函数作用:把数据结构中,行相同的数据去除。 #导入CSV数据 data <- read.csv('1.csv', fileEncoding = "UTF-8", stringsAsFactors = FALSE); #对重复数据去重 new_data <- unique(data) 重复值处理函数:unique,用于清洗数据中的重复值。 “dplyr”包中的distinct() 函数更强大: distinct(df,V1,V2) 根据V1和V2两个条件来进行去重 uniq
Erin
2018/01/09
8.3K0
@JsonSerialize 使用:注解方式 实现条件判断属性值、条件修改属性值
预期效果为:当查到属性值为 1 时,就给序列化后的 json 中性别字段赋值为 “男” , 0 则 ”女“ 。
微风-- 轻许--
2022/04/13
3K0
@JsonSerialize 使用:注解方式 实现条件判断属性值、条件修改属性值
[pr]变速中的“时间插值”选择
【剪辑中那些关于变速的技巧!】https://zhuanlan.zhihu.com/p/40174821 【视频变速的时间插值方式核心原理,你懂吗?】https://zhuanlan.zhihu.com/p/67327108 【更改剪辑的持续时间和速度】https://helpx.adobe.com/cn/premiere-pro/using/duration-speed.html#main-pars_heading_11
杨肆月
2020/09/10
4K0
pandas删除某列有空值的行_drop的之
dropna()方法,能够找到DataFrame类型数据的空值(缺失值),将空值所在的行/列删除后,将新的DataFrame作为返回值返回。
全栈程序员站长
2022/10/02
12K0
pandas删除某列有空值的行_drop的之
springBoot按条件装配:Condition
若file.encoding=’gbk’,则只装配GBKEncodingConverter
HUC思梦
2020/09/03
9630
按条件替换-------replace_if
内置数据类型: #include<iostream> using namespace std; #include<vector> #include<algorithm> //函数对象 class GREATERthan { public: bool operator()(int val) { if (val > 5) return true; //如果这里的false不写,那么默认返回true return false; } }; //普通函数 void print(int
大忽悠爱学习
2021/03/02
1.1K0
按条件替换-------replace_if

相似问题

按另一列有条件地排序

34

根据当前值条件选择最后n行

22

具有多个条件的按列有条件的r replace_na值

22

基于R中的多列有条件地删除行

224

按照条件选择最后N行

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档