如何在使用tidyr包separate_rows函数生成新行时,对复制的z字段值按规则修改?
Adjust
z Values After Splitting Rows with tidyr::separate_rows 我懂你想要的效果:用separate_rows拆分y列生成新行后,把同一原始行拆分出来的所有行的z值改成原始z的0.5倍。这里有两种简单直接的实现方式,适配不同的场景:
方法1:用原始数据的唯一标识分组调整
如果你的原始数据里有像x这样的唯一标识(每个原始行的x值不重复),可以直接按x分组处理:
library(tidyr) library(dplyr) # 定义原始数据框 df <- tibble( x = 1:4, y = c("a", "b,c,d", "e,f"), z = 1:4 ) # 拆分并调整z值 df_processed <- df %>% separate_rows(y) %>% group_by(x) %>% mutate(z = first(z) * 0.5) %>% ungroup() # 查看结果 df_processed
运行后就能得到你想要的输出:
A tibble: 6 x 3x y z
1 1 a 1
2 2 b 1
3 2 c 1
4 2 d 1
5 3 e 1.5
6 3 f 1.5
方法2:先添加索引再分组(无唯一标识时用)
如果原始数据没有现成的唯一标识列,先手动加个索引列就行,处理完还可以删掉:
df_processed <- df %>% mutate(index = row_number()) %>% # 添加行索引 separate_rows(y) %>% group_by(index) %>% mutate(z = first(z) * 0.5) %>% ungroup() %>% select(-index) # 移除索引列(可选)
额外说明
如果你的需求是只修改拆分出来的新行(保留原始行的z值,仅后续拆分行乘0.5),可以用组内行号判断:
df_processed <- df %>% separate_rows(y) %>% group_by(x) %>% mutate(z = ifelse(row_number() != 1, first(z)*0.5, z)) %>% ungroup()
不过看你给出的期望结果,第一种方法完全匹配你的需求~
内容的提问来源于stack exchange,提问作者lupo404
相关产品推荐
相关产品推荐

