我有这个名为mydf
. 数据帧被一行称为myid
. 所以,我想得到两列行之间的两个值(模数)的差异,CDS
并得到如下所示的结果。
mydf<- structure(list(c("myid:AHY03257.1", "176", "myid:YP_009182164.1",
"308", "myid:YP_717161.1", "9801", "8391", "8060"), c(NA, 2605L,
NA, 2443L, NA, 9659L, 8029L, 8407L), c("", "CDS", "", "CDS",
"", "CDS", "CDS", "CDS")), row.names = c(NA, -8L), class = "data.frame")
结果:
myid:AHY03257.1
176 2605 CDS 2429
myid:YP_009182164.1
308 2443 CDS 2135
myid:YP_717161.1
9801 9659 CDS 142
8391 8029 CDS 362
8060 8407 CDS 347
我们可以用tidyverse
. 将列名设置为数据集后,str_detect
根据:
第一列中出现的逻辑向量()的累积和进行分组,从'V1'中删除第一个观察值,将其转换为numeric
并获得与'V2'的绝对差柱子
library(tidyverse)
mydf %>%
set_names(paste0('V', seq_along(.))) %>%
group_by(grp = cumsum(str_detect(V1, ":"))) %>%
mutate(V4 = abs(V2 - c(NA, as.numeric(V1[-1])))) %>%
ungroup %>%
select(-grp) %>%
set_names(rep("", 4)) # better to have column name, removed to match input data
# A tibble: 8 x 4
# `` `` `` ``
# <chr> <int> <chr> <dbl>
#1 myid:AHY03257.1 NA "" NA
#2 176 2605 CDS 2429
#3 myid:YP_009182164.1 NA "" NA
#4 308 2443 CDS 2135
#5 myid:YP_717161.1 NA "" NA
#6 9801 9659 CDS 142
#7 8391 8029 CDS 362
#8 8060 8407 CDS 347
但是,如果警告消息没问题,那么我们可以直接将character
列 'V1' 转换为numeric
(由于存在非数字元素而发出警告 - 转换为NA
)并与 'V2' 列做绝对差异
mydf %>%
set_names(paste0("V", seq_along(.))) %>%
mutate(V4 = abs(V2 - as.numeric(V1)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句