如何在 tidyr/dplyr 中将矢量内容作为反引号变量
How to take vector content as backquote variable in tidyr/dplyr
我有以下数据框,它按我想要的方式工作
使用此代码:
df <- structure(list(celltype = structure(c(1L, 1L, 2L, 2L, 3L, 3L,
4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), .Label = c("Bcells",
"DendriticCells", "Macrophages", "Monocytes", "NKCells", "Neutrophils",
"StemCells", "StromalCells", "abTcells", "gdTCells"), class = "factor"),
sample = c("SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated"), `mean(score)` = c(0.160953535029424, 0.155743474395545,
0.104788051104575, 0.125247035158472, -0.159665650045289,
-0.134662049979712, 0.196249441751866, 0.212256889027029,
0.0532668251890109, 0.0738264693971133, 0.151828478029596,
0.159941552142933, -0.14128323638966, -0.120556640790534,
0.196518649474078, 0.185264282171863, 0.0654641151966543,
0.0837989059507186, 0.145111577618456, 0.145448549866796)), .Names = c("celltype",
"sample", "mean(score)"), row.names = c(7L, 8L, 17L, 18L, 27L,
28L, 37L, 38L, 47L, 48L, 57L, 58L, 67L, 68L, 77L, 78L, 87L, 88L,
97L, 98L), class = "data.frame")
library(tidyr)
library(dplyr)
df %>% spread(sample, `mean(score)`) %>%
mutate(pairwise_division = `SP ID treated` / `SP ID control`)
df
## celltype SP ID control SP ID treated pairwise_division
## 1 Bcells 0.16095354 0.15574347 0.9676300
## 2 DendriticCells 0.10478805 0.12524704 1.1952416
## 3 Macrophages -0.15966565 -0.13466205 0.8434003
## 4 Monocytes 0.19624944 0.21225689 1.0815668
## 5 NKCells 0.05326683 0.07382647 1.3859746
## 6 Neutrophils 0.15182848 0.15994155 1.0534358
## 7 StemCells -0.14128324 -0.12055664 0.8532976
## 8 StromalCells 0.19651865 0.18526428 0.9427313
## 9 abTcells 0.06546412 0.08379891 1.2800739
## 10 gdTCells 0.14511158 0.14544855 1.0023222
请注意,
行
mutate(pairwise_division = `SP ID treated` / `SP ID control`)
使用字符串的反引号。
然后我想做的是从
列表。我试过这个:
content <- c("SP ID treated" , "SP ID control")
df %>% spread(sample, `mean(score)`) %>%
mutate(pairwise_division = content[1] / content[2])
df
但是它给了我这个错误:
Error: non-numeric argument to binary operator
正确的做法是什么?
如果你想使用字符串作为参数,你必须使用 mutate_()
而不是 mutate()
。例如
df %>% spread(sample, `mean(score)`) %>%
mutate_(.dots=list(pairwise_division =
substitute(a/b, list(
a=as.name(content[1]),
b=as.name(content[2]))
)))
as.name()
将确保您获得有效的变量名。
我有以下数据框,它按我想要的方式工作 使用此代码:
df <- structure(list(celltype = structure(c(1L, 1L, 2L, 2L, 3L, 3L,
4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), .Label = c("Bcells",
"DendriticCells", "Macrophages", "Monocytes", "NKCells", "Neutrophils",
"StemCells", "StromalCells", "abTcells", "gdTCells"), class = "factor"),
sample = c("SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated", "SP ID control", "SP ID treated", "SP ID control",
"SP ID treated"), `mean(score)` = c(0.160953535029424, 0.155743474395545,
0.104788051104575, 0.125247035158472, -0.159665650045289,
-0.134662049979712, 0.196249441751866, 0.212256889027029,
0.0532668251890109, 0.0738264693971133, 0.151828478029596,
0.159941552142933, -0.14128323638966, -0.120556640790534,
0.196518649474078, 0.185264282171863, 0.0654641151966543,
0.0837989059507186, 0.145111577618456, 0.145448549866796)), .Names = c("celltype",
"sample", "mean(score)"), row.names = c(7L, 8L, 17L, 18L, 27L,
28L, 37L, 38L, 47L, 48L, 57L, 58L, 67L, 68L, 77L, 78L, 87L, 88L,
97L, 98L), class = "data.frame")
library(tidyr)
library(dplyr)
df %>% spread(sample, `mean(score)`) %>%
mutate(pairwise_division = `SP ID treated` / `SP ID control`)
df
## celltype SP ID control SP ID treated pairwise_division
## 1 Bcells 0.16095354 0.15574347 0.9676300
## 2 DendriticCells 0.10478805 0.12524704 1.1952416
## 3 Macrophages -0.15966565 -0.13466205 0.8434003
## 4 Monocytes 0.19624944 0.21225689 1.0815668
## 5 NKCells 0.05326683 0.07382647 1.3859746
## 6 Neutrophils 0.15182848 0.15994155 1.0534358
## 7 StemCells -0.14128324 -0.12055664 0.8532976
## 8 StromalCells 0.19651865 0.18526428 0.9427313
## 9 abTcells 0.06546412 0.08379891 1.2800739
## 10 gdTCells 0.14511158 0.14544855 1.0023222
请注意,
行mutate(pairwise_division = `SP ID treated` / `SP ID control`)
使用字符串的反引号。
然后我想做的是从 列表。我试过这个:
content <- c("SP ID treated" , "SP ID control")
df %>% spread(sample, `mean(score)`) %>%
mutate(pairwise_division = content[1] / content[2])
df
但是它给了我这个错误:
Error: non-numeric argument to binary operator
正确的做法是什么?
如果你想使用字符串作为参数,你必须使用 mutate_()
而不是 mutate()
。例如
df %>% spread(sample, `mean(score)`) %>%
mutate_(.dots=list(pairwise_division =
substitute(a/b, list(
a=as.name(content[1]),
b=as.name(content[2]))
)))
as.name()
将确保您获得有效的变量名。