R语言:无需for循环,在指定列出现*后递增新列值的最优方法
R语言实现:在"*"符号后递增生成分组列
问题描述
我有如下结构的数据表:
Value:
U
R
T
*
D
E
*
M
R
Z
*
...
需要新增一列,要求在第一列出现""时,新列的值在该""之后递增,预期结果如下:
Value, newcolumn:
U 1
R 1
T 1
- 1
D 2
E 2- 2
M 3
R 3
Z 3- 3
希望不使用for循环,用最符合R语言风格的方式实现。我曾尝试用rleid()函数,但该函数在Value列出现""时就会递增计数,不符合我需要在""之后才递增的需求。
数据结构如下:
structure(list(value = c("U", "R", "T", "*", "D", "E", "*", "M","R", "Z", "*")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,-11L))
解决方案
使用dplyr包的mutate()结合cumsum()和lag()函数即可实现:
library(dplyr) df %>% mutate(value2 = cumsum(lag(value, default = '') == '*') + 1)
原理说明
lag(value, default = ''):将value列整体下移一行,第一行用空字符串填充,以此定位当前行的前一行是否为"*"lag(...) == '*':生成逻辑向量,前一行是"*"的位置为TRUE,否则为FALSEcumsum():对逻辑向量累加,TRUE会被当作1计算,每遇到前一行是"*"的情况,累加值就加1+1:确保初始分组从1开始,而非0
内容的提问来源于stack exchange,提问作者T H
相关产品推荐
相关产品推荐

