R:如何计算作为字符存储的变量?
我想以数值向量的形式得到一个解。但是,当从csv读取我的df时,df的所有元素(包括字符和数字的混合)(这些字符在需要时用特定的值替换)将被转换为字符。知道如何避免/解决这个问题吗?
下面的代码只是模拟了我的问题:
#create two vectors and bind them into a df
c1 <- c("v-3", "v")
c2 <- c("1-v",0)
df <- data.frame(c1,c2)
df
c1 c2
1 v-3 1-v
2 v 0
#I would like to substitute "v" with a number
v <- 2
df
c1 c2
1 v-3 1-v
2 v 0现在,我如何恢复df元素的类,以便可以替换"v“,并计算值?或者我可以读csv,这样我的混合字符和数字就会以一种更友好的方式存储?
提前谢谢。格雷格
发布于 2020-12-16 23:59:39
您可以使用str_replace,然后映射eval/parse来计算表达式。
library(dplyr)
library(rlang)
df %>%
mutate(
across(everything(), str_replace, "v", "2"),
across(everything(), ~map_dbl(., function(to_eval) eval(parse(text=to_eval))))
)
c1 c2
1 -1 -1
2 2 0发布于 2020-12-17 02:20:30
这可能是一种更有效的方法来做你想要做的事情:
编写一个小函数:
tempfile
gsub将字母替换为值。
data.frame.
中,并将值插入到原始data.frame.的结构中。
以下是功能:
fun <- function(df, patt, repl, fixed = TRUE) {
fil <- tempfile()
writeLines(gsub(patt, repl, as.matrix(df), fixed = fixed), con = fil)
df[] <- sapply(parse(fil), eval)
df
}下面是如何使用该函数:
fun(df, "v", 2)
## c1 c2
## 1 -1 -1
## 2 2 0这是一个与另一个答案的时间比较,一个更大的数据集。
options <- c("v-3", "v", "v*2", "1-v", "v/5", 0, "v+2")
nrow <- 10000
ncol <- 20
set.seed(1)
df <- data.frame(matrix(sample(options, nrow*ncol, TRUE),
nrow = nrow, ncol = ncol))
fun2 <- function(df, patt, repl) {
# df = input data.frame
# patt = pattern to search for
# repl = replacement value (as character)
df %>%
mutate(
across(everything(), str_replace, patt, repl),
across(everything(), ~map_dbl(., function(to_eval) eval(parse(text=to_eval))))
)
}
library(microbenchmark)
microbenchmark(fun(df, "v", 2), fun2(df, "v", "2"), times = 10)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# fun(df, "v", 2) 831.731 924.9648 1159.544 1012.590 1366.072 1882.586 10 a
# fun2(df, "v", "2") 4471.800 4721.3587 4847.252 4853.269 4959.595 5157.823 10 bhttps://stackoverflow.com/questions/65332726
复制相似问题