楼主: slyi1
8187 9

[实际应用] R如何返回某一行中第一个大于某值的数的位置 [推广有奖]

  • 0关注
  • 0粉丝

高中生

5%

还不是VIP/贵宾

-

威望
0
论坛币
1 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
156 点
帖子
5
精华
0
在线时间
33 小时
注册时间
2017-12-14
最后登录
2019-5-31

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
R 新手求助!
有如下所示的数据集,
c1 c2 c3 c4 c5
1   0  3   6  9
2   1  2   10  12
3   0  4   11  13
如何返回每一行中c3-c5中第一个大于4的数值的位置,到一个新的变量中,如c6, 其对应的取值应该是4,4,3
求救~谢过!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:新手求助 数据集

沙发
cheetahfly 在职认证  发表于 2018-1-29 22:16:23 |只看作者 |坛友微信交流群
我非常确定会有更好,更简便的方法,但是,我想从dataframe变形的角度,用一种通用的解决方法:
  1. library(tidyverse)
  2. data %>%  # 假设数据是data.frame形式,变量名'data'
  3.     # 针对每行处理的问题可以转化为根据行数来分组
  4.     group_by(row_number()) %>%
  5.     # 将C1到C5的维度折叠至一个统一的维度'col_seq'
  6.     gather(col_seq, value, 1:5) %>%
  7.     # 根据现在组内的顺序增加‘标记’
  8.     mutate(seq = row_number()) %>%
  9.     # 去除原来的C1,C2列的数据
  10.     filter(seq >= 3) %>%
  11.     # 去除数值小于4的数据
  12.     filter(value >=4) %>%
  13.     # 每一组(原每一行)符合条件的第一个数据保留
  14.     slice(1) %>%
  15.     # 将对应的顺序标记提取出来。
  16.     pull(seq)
复制代码
已有 1 人评分论坛币 收起 理由
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

使用道具

藤椅
笨_O 发表于 2018-1-30 09:11:19 |只看作者 |坛友微信交流群
一个简单的循环就可以了
假设x是一个数据框,则
n<-dim(x)[2]
ss<-data.frame()
for(i in 1:n){
  ss[i,1]<-min(which(x[i]>=4))
}
ss
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

使用道具

板凳
jiangbeilu 学生认证  发表于 2018-1-30 10:57:59 |只看作者 |坛友微信交流群
笨_O 发表于 2018-1-30 09:11
一个简单的循环就可以了
假设x是一个数据框,则
n
你这个x是哪里来的呢

使用道具

报纸
jiangbeilu 学生认证  发表于 2018-1-30 10:59:05 |只看作者 |坛友微信交流群
提供一种方法:
which里面有一种用法,是判断后返回行列值的,然后对which返回结果进行过滤,就可以得到你要的结果了
  1. test <- data.frame(c1=c(3,5,6,2),
  2.            c2=c(4,6,2,1),
  3.                    c3=c(1,5,4,3)
  4.                    )
  5. library(dplyr)
  6. which(test>4,arr.ind=T) %>% data.frame() %>%  arrange(row,col) %>% group_by(row)  %>% slice(1)
复制代码

已有 1 人评分论坛币 收起 理由
cheetahfly + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

使用道具

地板
笨_O 发表于 2018-1-30 11:46:34 |只看作者 |坛友微信交流群
jiangbeilu 发表于 2018-1-30 10:59
提供一种方法:
which里面有一种用法,是判断后返回行列值的,然后对which返回结果进行过滤,就可以得到你 ...
x是假设的一个数据框,还有,这里是 group_by(col)吧?

使用道具

7
笨_O 发表于 2018-1-30 11:46:58 |只看作者 |坛友微信交流群
jiangbeilu 发表于 2018-1-30 10:59
提供一种方法:
which里面有一种用法,是判断后返回行列值的,然后对which返回结果进行过滤,就可以得到你 ...
这个方法很不错

使用道具

8
slyi1 发表于 2018-1-30 19:37:29 |只看作者 |坛友微信交流群
cheetahfly 发表于 2018-1-29 22:16
我非常确定会有更好,更简便的方法,但是,我想从dataframe变形的角度,用一种通用的解决方法:
谢谢!学习了

使用道具

9
slyi1 发表于 2018-1-30 19:38:48 |只看作者 |坛友微信交流群
jiangbeilu 发表于 2018-1-30 10:59
提供一种方法:
which里面有一种用法,是判断后返回行列值的,然后对which返回结果进行过滤,就可以得到你 ...
感激,这个对于数据量不大的是非常简单好用的,不过我现在处理的数据都特别的大,2个G左右,所以也十分愁怎么处理比较好,若您有比较好的建议欢迎交流

使用道具

10
jiangbeilu 学生认证  发表于 2018-1-31 07:35:51 |只看作者 |坛友微信交流群
笨_O 发表于 2018-1-30 11:46
x是假设的一个数据框,还有,这里是 group_by(col)吧?
你不是要每行第几个值么,当然是按row分组

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-21 09:12