我想知道是否有dplyr
相当于
df <- data.frame(A=1:5,B=2:6,C=-1:3)
df[df==2] <- 10
我正在寻找
df %>% <??>
即,可与其他dplyr
动词
答案 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已经解决了。但我很好奇基于dplyr
,dplyr
和基础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_all
(ifelse
)或M1
(replace
)的速度比其他方法慢得多。将M2
与管道(replace
)一起使用很快,但仍然比基本R(M3
)慢一点。将M4
转换为data.frame
,然后应用分配替换(data.table
)并不比M5
快。
因此,我认为在这种情况下,使用M4
函数没有特殊需要,因为它不比基本R方法(dplyr
)快。如果需要管道操作,也无需将M4
转换为data.frame
。我们可以使用data.table
(replace
)的管道。或者,我们可以定义一个函数,例如M3
,并将其放入管道操作中。