一个简单的数据框:
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 ?
答案 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
或者使用purrr
和dplyr
少两行:
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”可以避免重命名/创建新列