dplyr相当于DF [DF == X]< -Y

时间:2017-07-16 20:49:15

标签: r dplyr

我想知道是否有dplyr相当于

df <- data.frame(A=1:5,B=2:6,C=-1:3)
df[df==2] <- 10

我正在寻找

df %>% <??>

即,可与其他dplyr动词

链接的语句

2 个答案:

答案 0 :(得分:7)

1)替换试试这个。它只需要magrittr虽然dplyr导入了magrittr的相关部分,所以它也适用于dplyr:

df %>% replace(. == 2, 10)

,并提供:

   A  B  C
1  1 10 -1
2 10  3  0
3  3  4  1
4  4  5 10
5  5  6  3

1a)覆盖请注意,上述内容属于非破坏性内容,因此如果您要更新df,则需要将其分配回来:

df <- df %>% replace(. == 2, 10)

df %>% replace(. == 2, 10) -> df

或使用magrittr %<>%运算符,该运算符两次取消引用df

df %<>% replace(. == 2, 10)

2)算术这也可以:

df %>% { 10 * (. == 2) + . * (. != 2) }

答案 1 :(得分:2)

OP的问题是关于如何使用Chocolate Smoothies ya know替换值,并且由于G. Grothendieck已经解决了。但我很好奇基于dplyrdplyr和基础R的不同方法之间的表现如何不同。所以我设计并进行了以下基准测试。

data.table

结果显示,# Load package library(dplyr) library(data.table) library(microbenchmark) # Create example data frame df <- data.frame(A = 1:5, B = 2:6, C = -1:3) # Convert to data.table dt <- as.data.table(df) # Method 1: Use mutate_all and ifelse F1 = function(df){df %>% mutate_all(funs(ifelse(. == 2, 10, .)))} # Method 2: Use mutate_all and replace F2 = function(df){df %>% mutate_all(funs(replace(., . == 2, 10)))} # Method 3: Use replace F3 = function(df){df %>% replace(. == 2, 10)} # Method 4: Base R data frame assignment F4 = function(df){ df[df == 2] <- 10 return(df) } # Benchmarking microbenchmark( M1 = F1(df), M2 = F2(df), M3 = F3(df), M4 = F4(df), # Same as M4, but use data.table object as input M5 = F4(dt) ) Unit: microseconds expr min lq mean median uq max neval M1 8634.974 13028.7975 17224.4669 14907.3735 19496.5275 79750.182 100 M2 8925.565 12626.2675 16698.7412 15551.7410 18658.1125 35468.760 100 M3 282.252 391.6240 591.2534 553.5980 647.8965 3290.797 100 M4 163.578 252.1025 423.7627 349.6080 420.8125 5415.382 100 M5 228.367 333.2495 596.1735 440.3775 555.5230 7506.609 100 mutata_allifelse)或M1replace)的速度比其他方法慢得多。将M2与管道(replace)一起使用很快,但仍然比基本R(M3)慢一点。将M4转换为data.frame,然后应用分配替换(data.table)并不比M5快。

因此,我认为在这种情况下,使用M4函数没有特殊需要,因为它不比基本R方法(dplyr)快。如果需要管道操作,也无需将M4转换为data.frame。我们可以使用data.tablereplace)的管道。或者,我们可以定义一个函数,例如M3,并将其放入管道操作中。