在R中如何为指定行生成重复行并赋值,保留其他行数据?
解决方案
场景1:仅单一行val=1的情况
可以用tidyr::unnest配合列表赋值的方式直接生成目标结果:
library(tidyverse) x <- tibble( val = 1, val2 = NA ) x %>% mutate(val2 = if_else(val == 1, list(c(5, 2)), list(val2))) %>% unnest(val2)
运行后输出:
# A tibble: 2 × 2 val val2 <dbl> <dbl> 1 1 5 2 1 2
你之前尝试的直接赋值x$val2[x$val == 1] <- c(5,3)报错,是因为原数据仅1行,但你要赋值2个元素,长度不匹配;zeallot的%<-%是解构赋值,本身不具备扩展行的功能,所以只会取第一个值。
场景2:多val值需保留其他行的情况
方法1:mutate+unnest组合
针对val=1的行生成包含多个值的列表,其他行保持单个NA的列表,unnest后即可保留所有行同时扩展目标行:
library(tidyverse) x <- tibble( val = c(1,2,3), val2 = NA ) x %>% mutate(val2 = case_when( val == 1 ~ list(c(5, 2)), TRUE ~ list(val2) )) %>% unnest(val2)
运行结果完全符合预期:
# A tibble: 4 × 2 val val2 <dbl> <dbl> 1 1 5 2 1 2 3 2 NA 4 3 NA
方法2:bind_rows合并法
先筛选出val=1的行复制并赋值,再和原数据中val!=1的行合并,逻辑更直观:
x_target <- x %>% filter(val == 1) %>% slice(rep(1, 2)) %>% mutate(val2 = c(5, 2)) bind_rows(x_target, x %>% filter(val != 1)) %>% arrange(val)
内容的提问来源于stack exchange,提问作者Jorge Hernández
相关产品推荐
相关产品推荐

