标签: mutate

dplyr包可以用于条件变异吗?

当突变是有条件的(取决于某些列值的值)时,是否可以使用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)

if-statement r case-when dplyr mutate

157
推荐指数
5
解决办法
15万
查看次数

将mutate与条件值组合使用

在具有四列的大型数据框("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)

这应该是结果: …

r dplyr mutate

68
推荐指数
3
解决办法
12万
查看次数

dplyr/tidyevaluation:如何将mutate中的表达式作为字符串传递?

我想编写一个有两个输入的函数:一个新变量的名称和一个数学表达式.两个参数都是字符串.

此函数应采用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 dplyr mutate tidyeval

11
推荐指数
1
解决办法
1648
查看次数

如何使用purrr中的map与dplyr :: mutate基于列对创建多个新列

我必须使用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)

r dplyr purrr mutate

10
推荐指数
4
解决办法
7353
查看次数

R:行方式dplyr :: mutate使用带有数据帧行并返回整数的函数

我试图使用自定义函数管道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我得到预期的CD(和那些未提及的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)

row r dplyr mutate

8
推荐指数
2
解决办法
1万
查看次数

如何在mutate(dplyr)中使用自定义函数?

我正在使用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如何工作的误解.

r dplyr mutate

8
推荐指数
2
解决办法
7087
查看次数

在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)

text r dplyr mutate

8
推荐指数
2
解决办法
4641
查看次数

应用group_by和summarise(sum),但保留具有不相关冲突数据的列?

我的问题与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)

group-by r summarize tidyverse mutate

7
推荐指数
3
解决办法
5699
查看次数

检查一个变量R内的各种DATE的差异

我想在变量包含不同的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列,请随意更改上述所有操作.

r date list unnest mutate

7
推荐指数
1
解决办法
76
查看次数

从R中的变量列表创建一个变量?

我在数据帧中有一系列变量(超过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)

r dplyr tidyverse mutate

7
推荐指数
2
解决办法
315
查看次数

标签 统计

mutate ×10

r ×10

dplyr ×8

tidyverse ×2

case-when ×1

date ×1

group-by ×1

if-statement ×1

list ×1

purrr ×1

row ×1

summarize ×1

text ×1

tidyeval ×1

unnest ×1