当突变是有条件的(取决于某些列值的值)时,是否可以使用mutate?
这个例子有助于显示我的意思.
structure(list(a = c(1, 3, 4, 6, 3, 2, 5, 1), b = c(1, 3, 4,
2, 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4,
5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4,
2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA,
8L), class = "data.frame")
a b c …
Run Code Online (Sandbox Code Playgroud) 在具有四列的大型数据框("myfile")中,我必须添加第五列,其中值基于前四列.最近我成为了dplyr的忠实粉丝,主要是因为它在大型数据集中的速度.所以我想知道我是否可以使用mutate函数处理我的问题.
我的数据帧(实际上是它的较短版本)看起来有点像这样:
V1 V2 V3 V4
1 1 2 3 5
2 2 4 4 1
3 1 4 1 1
4 4 5 1 3
5 5 5 5 4
...
Run Code Online (Sandbox Code Playgroud)
第五列(V5)的值基于一些条件规则:
if (V1==1 & V2!=4) {
V5 <- 1
} else if (V2==4 & V3!=1) {
V5 <- 2
} else {
V5 <- 0
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用mutate函数在所有行上使用这些规则(所以我不必使用慢循环).像这样的东西(是的,我知道它不会这样工作!):
myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
else if (V2==4 & V3!=1){V5 = 2}
else {V5 = 0})
Run Code Online (Sandbox Code Playgroud)
这应该是结果: …
我想编写一个有两个输入的函数:一个新变量的名称和一个数学表达式.两个参数都是字符串.
此函数应采用data.frame并添加指定的新变量,该变量应该是给定数学表达式的结果.
这是我尝试过的最小工作示例:
df <- tibble(A = 1:10, B = 1:10)
new_var <- "C"
expression <- "A + B"
example_fun <- function(new_var, expression) {
new_var_sym <- sym(new_var)
expression_sym <- sym(expression)
mutate(df, !! new_var_sym := !! expression_sym)
}
example_fun(new_var, expression)
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
Error in mutate_impl(.data, dots) : Binding not found: A + B.
当我在函数中包含mutate行时expr()
,我得到了
mutate(df, `:=`(C, `A + B`))
Run Code Online (Sandbox Code Playgroud)
似乎周围的蜱A + B
不应该存在,但我无法弄清楚如何摆脱它们.至少,enquo()
并quo_name()
没有帮助.
我必须使用R来关注问题.简而言之,我想基于数据框中不同列对的计算在数据帧中创建多个新列.
数据如下:
df <- data.frame(a1 = c(1:5),
b1 = c(4:8),
c1 = c(10:14),
a2 = c(9:13),
b2 = c(3:7),
c2 = c(15:19))
df
a1 b1 c1 a2 b2 c2
1 4 10 9 3 15
2 5 11 10 4 16
3 6 12 11 5 17
4 7 13 12 6 18
5 8 14 13 7 19
Run Code Online (Sandbox Code Playgroud)
输出应该如下所示:
a1 b1 c1 a2 b2 c2 sum_a sum_b sum_c
1 4 10 9 3 15 10 7 25
2 5 …
Run Code Online (Sandbox Code Playgroud) 我试图使用自定义函数管道mutate语句.我看起来有点类似的SO帖子但是徒劳无功.假设我有一个这样的数据框(其中blob
一些变量与特定任务无关,但是是整个数据的一部分):
df <-
data.frame(exclude=c('B','B','D'),
B=c(1,0,0),
C=c(3,4,9),
D=c(1,1,0),
blob=c('fd', 'fs', 'sa'),
stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)
我有一个使用变量名的函数,所以根据exclude
列中的值选择一些,例如计算未指定的变量的总和exclude
(总是单个字符).
FUN <- function(df){
sum(df[c('B', 'C', 'D')] [!names(df[c('B', 'C', 'D')]) %in% df['exclude']] )
}
Run Code Online (Sandbox Code Playgroud)
当我给出一行(第1行)时,FUN
我得到预期的C
和D
(和那些未提及的exclude
),即4:
FUN(df[1,])
Run Code Online (Sandbox Code Playgroud)
如何在具有mutate的管道中进行类似操作(将结果添加到变量中s
).这两次尝试不起作用:
df %>% mutate(s=FUN(.))
df %>% group_by(1:n()) %>% mutate(s=FUN(.))
Run Code Online (Sandbox Code Playgroud)
更新 这也不能按预期工作:
df %>% rowwise(.) %>% mutate(s=FUN(.))
Run Code Online (Sandbox Code Playgroud)
这是有原因的,但不在dplyr的mutate(和管道)中:
df$s <- sapply(1:nrow(df), function(x) FUN(df[x,]))
Run Code Online (Sandbox Code Playgroud) 我正在使用dplyr重写我的所有代码,并需要mutate/mutate_at函数的帮助.我需要的是将自定义函数应用于我的表中的两列.理想情况下,我会通过它们的索引来引用这些列,但现在我甚至无法通过名称引用它.
功能是:
binom.test.p <- function(x) {
if (is.na(x[1])|is.na(x[2])|(x[1]+x[2])<10) {
return(NA)
}
else {
return(binom.test(x, alternative="two.sided")$p.value)
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据:
table <- data.frame(geneId=c("a", "b", "c", "d"), ref_SG1_E2_1_R1_Sum = c(10,20,10,15), alt_SG1_E2_1_R1_Sum = c(10,20,10,15))
Run Code Online (Sandbox Code Playgroud)
所以我这样做:
table %>%
mutate(Ratio=binom.test.p(c(ref_SG1_E2_1_R1_Sum, alt_SG1_E2_1_R1_Sum)))
Error: incorrect length of 'x'
Run Code Online (Sandbox Code Playgroud)
如果我做:
table %>%
mutate(Ratio=binom.test.p(ref_SG1_E2_1_R1_Sum, alt_SG1_E2_1_R1_Sum))
Error: unused argument (c(10, 20, 10, 15))
Run Code Online (Sandbox Code Playgroud)
第二个错误可能是因为我的函数需要一个向量而是获得两个参数.
但即使忘记了我的功能.这有效:
table %>%
mutate(sum = ref_SG1_E2_1_R1_Sum + alt_SG1_E2_1_R1_Sum)
Run Code Online (Sandbox Code Playgroud)
这不是:
table %>%
mutate(.cols=c(2:3), .funs=funs(sum=sum(.)))
Error: wrong result size (2), expected 4 or 1
Run Code Online (Sandbox Code Playgroud)
所以这可能是我对dplyr如何工作的误解.
我试图计算源向量和tibble中的比较向量之间的Jaccard相似性.
首先,使用names_字段(字符串向量)创建一个tibble.使用dplyr的mutate,创建names_vec,列表列,其中每行现在是一个向量(向量的每个元素都是一个字母).
然后,使用列jaccard_sim创建一个新的tibble,它应该计算Jaccard相似度.
source_vec <- c('a', 'b', 'c')
df_comp <- tibble(names_ = c("b d f", "u k g", "m o c"),
names_vec = strsplit(names_, ' '))
df_comp_jaccard <- df_comp %>%
dplyr::mutate(jaccard_sim = length(intersect(names_vec, source_vec))/length(union(names_vec, source_vec)))
Run Code Online (Sandbox Code Playgroud)
jaccard_sim中的所有值都为零.但是,如果我们运行这样的东西,我们得到第一个条目的正确的Jaccard相似度为0.2:
a <- length(intersect(source_vec, df_comp[[1,2]]))
b <- length(union(source_vec, df_comp[[1,2]]))
a/b
Run Code Online (Sandbox Code Playgroud) 我的问题与Applying group_by非常相似,并在保留所有列信息的同时对数据进行汇总, 但我想保留被排除的列,因为它们在分组后会发生冲突。
Label <- c("203c","203c","204a","204a","204a","204a","204a","204a","204a","204a")
Type <- c("wholefish","flesh","flesh","fleshdelip","formula","formuladelip",
"formula","formuladelip","wholefish", "wholefishdelip")
Proportion <- c(1,1,0.67714,0.67714,0.32285,0.32285,0.32285,
0.32285, 0.67714,0.67714)
N <- (1:10)
C <- (1:10)
Code <- c("c","a","a","b","a","b","c","d","c","d")
df <- data.frame(Label,Type, Proportion, N, C, Code)
df
Label Type Proportion N C Code
1 203c wholefish 1.0000 1 1 c
2 203c flesh 1.0000 2 2 a
3 204a flesh 0.6771 3 3 a
4 204a fleshdelip 0.6771 4 4 b
5 204a formula 0.3228 5 5 a
6 204a formuladelip …
Run Code Online (Sandbox Code Playgroud) 我想在变量包含不同的YEAR时拆分行,也拆分col:"Price"用均匀的除以日期的数字 - > count(";")+1
有一个表尚未拆分变量.
# Dataset call df
Price Date
500 2016-01-01
400 2016-01-03;2016-01-09
1000 2016-01-04;2017-09-01;2017-08-10;2018-01-01
25 2016-01-04;2017-09-01
304 2015-01-02
238 2018-01-02;2018-02-02
Run Code Online (Sandbox Code Playgroud)
欲望展望
# Targeted df
Price Date
500 2016-01-01
400 2016-01-03;2016-01-09
250 2016-01-04
250 2017-09-01
250 2017-08-10
250 2018-01-01
12.5 2016-01-04
12.5 2017-09-01
304 2015-01-02
238 2018-01-02;2018-02-02
Run Code Online (Sandbox Code Playgroud)
一旦变量包含不同的年份定义,下面是操作必须做的.(这只是一个例子.)
mutate(Price = ifelse(DIFFERENT_DATE_ROW,
as.numeric(Price) / (str_count(Date,";")+1),
as.numeric(Price)),
Date = ifelse(DIFFERENT_DATE_ROW,
strsplit(as.character(Date),";"),
Date)) %>%
unnest()
Run Code Online (Sandbox Code Playgroud)
我遇到了一些不能使用dplyr函数的约束,"if_else"
因为
否则无法识别NO操作.只有ifelse正常工作.
如何找出一个变量中的年份差异来PROVOKE分割线和拆分价格计算?
到目前为止分裂元素的操作就像
unlist(lapply(unlist(strsplit(df1$noFDate[8],";")),FUN = year))
Run Code Online (Sandbox Code Playgroud)
无法解决问题.
我是编码的初学者,请考虑真实数据超过200万行和50列,请随意更改上述所有操作.
我在数据帧中有一系列变量(超过100个),并且我想创建一个指示符变量,以了解任何变量中是否存在特定的文本模式。以下是具有三个变量的示例。我发现的一种解决方案是使用,tidyr::unite()
然后使用dplyr::mutate()
,但是我对不必统一变量的解决方案感兴趣。
c1<-c("T1", "X1", "T6", "R5")
c2<-c("R4", "C6", "C7", "X3")
c3<-c("C5", "C2", "X4", "T2")
df<-data.frame(c1, c2, c3)
c1 c2 c3
1 T1 R4 C5
2 X1 C6 C2
3 T6 C7 X4
4 R5 X3 T2
code.vec<-c("T1", "T2", "T3", "T4") #Text patterns of interest
code_regex<-paste(code.vec, collapse="|")
new<-df %>%
unite(all_c, c1:c3, remove=FALSE) %>%
mutate(indicator=if_else(grepl(code_regex, all_c), 1, 0)) %>%
select(-(all_c))
c1 c2 c3 indicator
1 T1 R4 C5 1
2 X1 C6 C2 0
3 T6 C7 X4 0 …
Run Code Online (Sandbox Code Playgroud)