如何解决R- 如何更新仅与列包含某个数字开头的行有关的列值?
我有一个如下所示的数据集:
ex <- data.frame("id" =c(rep(1234,6)),"case" = c(45,45,92,93),"cpt" = c(20600,25263,8456,2345,9023,"C1245"),"date"=c("2019-05-21","2019-08-22","2019-04-12","2019-03-01","2019-02-18","2019-03-12"),"window"=c(10,20,NA,NA),"pay"=c(520,140,2200,230,600,700))
我基本上有两个问题: 我怎样才能更新 cpt 列的 cpt 值对应于最高 pay 的行按案例分组only 重点关注包含以数字 2 开头的 cpt 值的任何行在此之后,我如何更新窗口列以用 NA 替换任何不是最大值的值(也只关注 cpt 值以 2 开头的行)
我希望最终输出看起来像这样:
ex1 <- data.frame("id" =c(rep(1234,20600,700))
我有两个代码
ex[,cpt:=cpt[which.max(pay)],by=case]
ex %>% group_by(case) %>% mutate(window=replace(window,(pay < max(pay)),NA)) %>%
setDT()
但是这两个代码都适用于整体最大值并且会产生
ex2 <- data.frame("id" =c(rep(1234,"cpt" = c(8456,"window"=c(NA,700))
有什么办法可以改变我必须得到的代码才能得到我正在寻找的输出?或者任何其他可能更有效的代码?提前致谢!
解决方法
我们创建一个逻辑向量(i1)
基于 'cpt' 的第一个字符(substr
- 因为 OP 对那些以“2”开头的元素感兴趣),按 'id 分组','case',if
有 any
'i1',然后使用它对 'pay' 进行子集化,使用 which.max
获取 'max' 元素的索引,并使用它来子集'cpt'的子集(cpt[i1]
)或else
返回原始列'cpt',然后我们replace
'窗口',其中'cpt'与'cpt'不同将列 'cpt1'(原始列)复制到 NA
和 ungroup
library(dplyr)
ex %>%
mutate(cpt1 = cpt) %>%
group_by(id,case) %>%
mutate(i1 = substr(cpt,1,1) == "2",cpt = if(any(i1)) cpt[i1][which.max(pay[i1])] else cpt,window = replace(window,cpt != cpt1,NA),i1 = NULL,cpt1 = NULL) %>%
ungroup
-输出
# A tibble: 6 x 6
# id case cpt date window pay
# <dbl> <dbl> <chr> <chr> <dbl> <dbl>
#1 1234 45 20600 2019-05-21 10 520
#2 1234 45 20600 2019-08-22 NA 140
#3 1234 45 20600 2019-04-12 NA 2200
#4 1234 92 2345 2019-03-01 45 230
#5 1234 92 2345 2019-02-18 NA 600
#6 1234 93 C1245 2019-03-12 NA 700
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。