R语言中拆分列转行并将新行Frequency设为0的实现问题
解决方案:拆分列并修改新行的Frequency值
我明白你的需求啦——你想把数据框里用逗号分隔的Alels列拆分成多行,同时只有每个原始组里的第一个元素保留原来的Frequency值,其余新行的Frequency都设为0。用separate()确实做不到这个,因为它是拆分列而非生成行,而且没法自动修改新行的数值。咱们换个方法来实现:
步骤1:加载所需包并构造原始数据
首先我们需要tibble(用来构造数据框)、tidyr(用来拆分生成行)和dplyr(用来分组修改数值):
library(tibble) library(tidyr) library(dplyr) # 构造你的原始数据框 df <- tibble( Frequency = c(0.5, 0.6, 0.02), Alels = c("C", "C,G", "A,T,TTT") )
步骤2:拆分列并修改Frequency值
我们先给原始数据添加行号标记每个原始行,然后用separate_rows()拆分Alels列生成多行,最后分组将每组内除第一行外的Frequency设为0:
result_df <- df %>% mutate(row_id = row_number()) %>% # 添加行号,标记每个原始数据行 separate_rows(Alels, sep = ",") %>% # 按逗号拆分Alels列,生成多行 group_by(row_id) %>% # 按原始行分组 mutate(Frequency = ifelse(row_number() == 1, Frequency, 0)) %>% # 每组第一行保留原频率,其余设为0 ungroup() %>% # 取消分组 select(-row_id) # 移除临时行号列 # 查看结果 print(result_df)
最终输出结果
运行上述代码后,你会得到想要的结果:
# A tibble: 6 × 2 Frequency Alels <dbl> <chr> 1 0.5 C 2 0.6 C 3 0 G 4 0.02 A 5 0 T 6 0 TTT
为什么separate()不行?
separate()函数的作用是将单个列拆分成多个列,而不是生成新行;而你需要的是将单个列的多个值拆分成多行,这时候separate_rows()才是正确的工具。另外,separate()没有内置的功能可以修改拆分后生成的行的其他列数值,所以必须配合分组和条件赋值来实现你的需求。
内容的提问来源于stack exchange,提问作者Javier bertol chorro
相关产品推荐
相关产品推荐

