Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用dplyr在多组行之间划分变量而不列出它们?_R_Dplyr - Fatal编程技术网

如何使用dplyr在多组行之间划分变量而不列出它们?

如何使用dplyr在多组行之间划分变量而不列出它们?,r,dplyr,R,Dplyr,下面是这个问题 如果我有这个数据框: id = c("a","a","b","b","c","c") condition = c(0,1,0,1,0,1) gene1 = sample(1:100,6) gene2 = sample(1:100,6) #... geneN = sample(1:100,6) df = data.frame(id,condition,gene1,gene2,geneN) 我想按id分组,并将条件==0的行的值除以条件==1的行,得到以下结果: df[condi

下面是这个问题

如果我有这个数据框:

id = c("a","a","b","b","c","c")
condition = c(0,1,0,1,0,1)
gene1 = sample(1:100,6)
gene2 = sample(1:100,6)
#...
geneN = sample(1:100,6)

df = data.frame(id,condition,gene1,gene2,geneN)
我想按id分组,并将条件==0的行的值除以条件==1的行,得到以下结果:

df[condition == 0,3:5]/ df[condition == 1,3:5]
#
      gene1     gene2     geneN
1 0.2187500 0.4946237 0.3750000
3 0.4700000 0.6382979 0.5444444
5 0.7674419 0.5471698 2.3750000
我可以按如下方式使用dplyr:

df %>% 
    group_by(id) %>%
    summarise(gene1 = gene1[condition == 0] / gene1[condition == 1],
              gene2 = gene2[condition == 0] / gene2[condition == 1],
              geneN = geneN[condition == 0] / geneN[condition == 1])
但我有100个变量,如下所示。我怎样才能做到这一点而不必列出所有的基因

id = c("a","a","b","b","c","c")
condition = c(0,1,0,1,0,1)
genes = matrix(1:600,ncol = 100)
df = data.frame(id,condition,genes)

我们可以使用
summary_at
对许多列应用相同的操作

library(dplyr)

df2 <- df %>%
  group_by(id) %>%
  arrange(condition) %>%
  summarise_at(vars(-condition), funs(first(.)/last(.))) %>%
  ungroup()
df2
# # A tibble: 3 x 4
#   id    gene1 gene2 geneN
#   <fct> <dbl> <dbl> <dbl>
# 1 a     0.524 2.28  0.654
# 2 b     1.65  0.616 1.38 
# 3 c     0.578 2.00  2.17 
库(dplyr)
df2%
分组依据(id)%>%
安排(条件)%>%
总结(变量(-condition)、funs(first(.)/last(.))%>%
解组()
df2
##tibble:3 x 4
#id gene1 gene2 geneN
#      
#1 a 0.524 2.28 0.654
#2 b 1.65 0.616 1.38
#3 c 0.5782.00 2.17

我们可以使用处的summary_对许多列应用相同的操作

library(dplyr)

df2 <- df %>%
  group_by(id) %>%
  arrange(condition) %>%
  summarise_at(vars(-condition), funs(first(.)/last(.))) %>%
  ungroup()
df2
# # A tibble: 3 x 4
#   id    gene1 gene2 geneN
#   <fct> <dbl> <dbl> <dbl>
# 1 a     0.524 2.28  0.654
# 2 b     1.65  0.616 1.38 
# 3 c     0.578 2.00  2.17 
库(dplyr)
df2%
分组依据(id)%>%
安排(条件)%>%
总结(变量(-condition)、funs(first(.)/last(.))%>%
解组()
df2
##tibble:3 x 4
#id gene1 gene2 geneN
#      
#1 a 0.524 2.28 0.654
#2 b 1.65 0.616 1.38
#3 c 0.5782.00 2.17
您可以试试

df %>% 
  gather(k,v, -id, -condition) %>% 
  spread(condition, v) %>% 
  mutate(ratio=`0`/`1`) %>% 
  select(id, k, ratio) %>% 
  spread(k, ratio)
  id      gene1     gene2    geneN
1  a  0.3670886 0.5955056 1.192982
2  b  0.4767442 1.2222222 0.125000
3  c 18.2000000 2.0909091 6.000000
将数据用于set.seed(123)您可以尝试

df %>% 
  gather(k,v, -id, -condition) %>% 
  spread(condition, v) %>% 
  mutate(ratio=`0`/`1`) %>% 
  select(id, k, ratio) %>% 
  spread(k, ratio)
  id      gene1     gene2    geneN
1  a  0.3670886 0.5955056 1.192982
2  b  0.4767442 1.2222222 0.125000
3  c 18.2000000 2.0909091 6.000000

将数据与set.seed(123)一起使用如果数据集已排序且无异常,则可以使用
purr::map\u dfr

df[paste0("gene",c(1,2,"N"))] %>% map_dfr(~.x[c(F,T)]/.x[c(T,F)])
# # A tibble: 3 x 3
#       gene1    gene2      geneN
#       <dbl>    <dbl>      <dbl>
# 1 0.1764706 1.323944 38.5000000
# 2 0.4895833 0.531250  0.3478261
# 3 0.3278689 2.705882  1.2424242

您可能需要绑定
观测值,我跳过了此步骤,因为它不在您的预期输出中。

如果您的数据集已排序且没有不规则,则可以使用
purr::map\u dfr
执行此操作:

df[paste0("gene",c(1,2,"N"))] %>% map_dfr(~.x[c(F,T)]/.x[c(T,F)])
# # A tibble: 3 x 3
#       gene1    gene2      geneN
#       <dbl>    <dbl>      <dbl>
# 1 0.1764706 1.323944 38.5000000
# 2 0.4895833 0.531250  0.3478261
# 3 0.3278689 2.705882  1.2424242

您可能需要绑定
观察值
,我跳过了此步骤,因为它不在您的预期输出中。

请您修改示例并包含“许多变量”好吗?更新了问题。请您修改示例并包含“许多变量”好吗更新了该问题。您可能需要添加一个
排列
,以确保划分的行正确,因为
first()
last()
不会检查它。@CPak好主意。我要补充一点。这个答案很好,但对于较大的数据,例如id=c(“a”、“a”、“b”、“b”、“c”、“c”);条件=c(0,1,0,1,0,1);基因=基质(1:30000,ncol=5000);df=data.frame(id,condition,genes)如果是这种情况,也许可以探索
data.table
中的解决方案,或者使用
matrix
进行所有计算。您可能需要添加一个
arrange
以确保您划分的行是正确的,因为
first()
last()
不会检查它。@CPak好主意。我要补充一点。这个答案很好,但对于较大的数据,例如id=c(“a”、“a”、“b”、“b”、“c”、“c”);条件=c(0,1,0,1,0,1);基因=基质(1:30000,ncol=5000);df=data.frame(id、条件、基因)如果是这种情况,也许可以在
data.table
中探索解决方案,或者使用
matrix
进行所有计算。