将数据框中的所有值除以最小值

时间:2018-07-04 12:53:26

标签: r dataframe dplyr

一个简单的数据框:

df1 <- data.frame(
  gene = c("PKB", "PKB_1", "PKB_2", "ESR", "ESR_1", "MKB", "PKC", "PKC_1"),
  b = c(1.8,2,3,NA,5,6,NA,NA),
  c = c(9,10,11,NA,NA,12,13,NA))

我希望将df中的所有值除以df中的最小值,同时保持所有列不变。可以删除所有值为NA的行。

我该如何做,最好使用 dplyr

4 个答案:

答案 0 :(得分:1)

您可以尝试使用dplyr。将1更改为3以更好地说明正在发生的事情。

df1 <- data.frame(
  gene = c("PKB", "PKB_1", "PKB_2", "ESR", "ESR_1", "MKB", "PKC", "PKC_1"),
  b = c(3,2,3,NA,5,6,NA,NA),
  c = c(9,10,11,NA,NA,12,13,NA))

library(dplyr)

df1 %>% 
  mutate(min=min(b,c, na.rm = T)) %>% 
  mutate_at(vars(b:c), funs(min=./min))
   gene  b  c min b_min c_min
1   PKB  3  9   2   1.5   4.5
2 PKB_1  2 10   2   1.0   5.0
3 PKB_2  3 11   2   1.5   5.5
4   ESR NA NA   2    NA    NA
5 ESR_1  5 NA   2   2.5    NA
6   MKB  6 12   2   3.0   6.0
7   PKC NA 13   2    NA   6.5
8 PKC_1 NA NA   2    NA    NA

您可以尝试在R为基础

df[-1] <- df1[-1]/min(df1[-1], na.rm = T)

答案 1 :(得分:0)

这有用吗?

 df1 %>% 
 mutate(b = b/min(c(df1$b,df1$c),na.rm=T), c = c/min(c(df1$b,df1$c),na.rm=T))

答案 2 :(得分:0)

df1 %>% 
  filter(!rowSums(is.na(.)) == 2) %>% 
  mutate(minval = min(b,c, na.rm = T)) %>% 
  mutate_at(vars(b,c), funs(./minval)) %>% 
  select(-minval)

  gene        b        c
1   PKB 1.000000 5.000000
2 PKB_1 1.111111 5.555556
3 PKB_2 1.666667 6.111111
4 ESR_1 2.777778       NA
5   MKB 3.333333 6.666667
6   PKC       NA 7.222222

或者使用purrrdplyr少两行:

df1 %>% 
  filter(!rowSums(is.na(.)) == 2) %>% 
  mutate_at(vars(b,c), funs(./min(df1[ ,map_lgl(df1, is.numeric)], na.rm = T))) 

   gene        b        c
1   PKB 1.000000 5.000000
2 PKB_1 1.111111 5.555556
3 PKB_2 1.666667 6.111111
4 ESR_1 2.777778       NA
5   MKB 3.333333 6.666667
6   PKC       NA 7.222222

答案 3 :(得分:0)

大概只使用数字列s:

df%>%group_by(gene) %>summarise(unique (gene),"ColB" = b/min(df$b,na.rm=TRUE),"ColC"= c/min(df$c, na.rm=TRUE))

通过删除名称“ ColB”,“ ColC”可以避免重命名/创建新列