首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中得到组内列之间的差异?

如何在R中得到组内列之间的差异?
EN

Stack Overflow用户
提问于 2018-08-19 15:09:42
回答 2查看 146关注 0票数 1

我有一个叫做mydf的数据。在那里,dataframe被一个名为myid的行分隔为每个组。因此,我希望得到行CDS的两列之间的两个值(模块)的差异,并得到如下所示的结果。

代码语言:javascript
复制
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")

结果:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-19 15:18:50

我们可以用tidyverse来做这件事。将列名设置为数据集后,根据第一列中出现的逻辑向量(str_detect)的累积和进行分组,从“V1”中移除第一个观察值,将其转换为numeric,得到与“V2”列的绝对差值。

代码语言:javascript
复制
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’列进行绝对区别时,就会发出警告。

代码语言:javascript
复制
mydf %>% 
  set_names(paste0("V", seq_along(.))) %>%
  mutate(V4 = abs(V2 - as.numeric(V1)))
票数 2
EN

Stack Overflow用户

发布于 2018-08-19 15:23:28

首先,让我重新排序您创建的那种数据集:

代码语言:javascript
复制
mydf <- data.frame(mydf= 
c("AHY03257.1","YP_009182164.1","YP_717161.1","YP_717161.1","YP_717161.1"),value_1= 
c(176,308,9801,8391,8060),value_2=c(2605,2443,9659,8029,8407),CDS=rep("CDS",5))

然后,您必须创建一个新列:

代码语言:javascript
复制
mydf$abs_diff <- abs(mydf$value_2 - mydf$value_1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51919024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档