首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算作为字符存储在R中的变量

计算作为字符存储在R中的变量
EN

Stack Overflow用户
提问于 2020-12-16 23:43:57
回答 2查看 151关注 0票数 1

R:如何计算作为字符存储的变量?

我想以数值向量的形式得到一个解。但是,当从csv读取我的df时,df的所有元素(包括字符和数字的混合)(这些字符在需要时用特定的值替换)将被转换为字符。知道如何避免/解决这个问题吗?

下面的代码只是模拟了我的问题:

代码语言:javascript
复制
#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,这样我的混合字符和数字就会以一种更友好的方式存储?

提前谢谢。格雷格

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-16 23:59:39

您可以使用str_replace,然后映射eval/parse来计算表达式。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-12-17 02:20:30

这可能是一种更有效的方法来做你想要做的事情:

编写一个小函数:

tempfile

  • Parses

  • 使用gsub将字母替换为值。

  • 将结果写到data.frame.

中,并将值插入到原始data.frame.的结构中。

以下是功能:

代码语言:javascript
复制
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
}

下面是如何使用该函数:

代码语言:javascript
复制
fun(df, "v", 2)
##   c1 c2
## 1 -1 -1
## 2  2  0

这是一个与另一个答案的时间比较,一个更大的数据集。

代码语言:javascript
复制
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   b
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65332726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档