我想替换字符串的一部分(在前 2 个下划线之间,第一组始终为“i”),如下面的基本 R 示例所示:
library(dplyr)
library(stringr)
d <- tibble(txt = c("i_0000_GES", "i_0000_OISO", "i_0000_ASE1333"),
repl = c("1111", "1111", "2222"))
str_sub(d$txt, 3, 6) <- d$repl
d
# A tibble: 3 x 2
# txt repl
# <chr> <chr>
# 1 i_1111_GES 1111
# 2 i_1111_OISO 1111
# 3 i_2222_ASE1333 2222
Run Code Online (Sandbox Code Playgroud)
我如何使用str_sub<-或其他字符串函数来做到这一点?
我想将 geom_area() 的起始 y 级别从零移开。这是在下面的例子中,第一个函数调用没问题,但我怎样才能纠正第二个调用的情节:
library(ggplot2)
set.seed(123)
myplot <- function (split.value) {
year <- (2000:2017)
index <- rnorm(18, split.value,5)
interp <- approx(year, index, n=1000)
df <- data.frame(year = interp$x,
index = interp$y,
valence = ifelse(interp$y <= split.value, "pos", "neg"),
stringsAsFactors = FALSE)
ggplot(df, aes(x = year, y = index)) +
geom_area(aes(fill = valence), alpha = 0.5) +
geom_line() +
geom_hline(yintercept = split.value) +
scale_fill_manual(values=c("green", "red"), guide=FALSE) +
scale_x_continuous(expand=c(0, 0))
} # cf. R Graphics Cookbook
myplot(0) # o.k. (with more …Run Code Online (Sandbox Code Playgroud) 我想在使用map循环时提取当前列的列名.例如,如果有一些变量,我想取消缩放:
library(tidyverse)
d <- tibble(a = runif(10), b = runif(10), c = runif(10))
l <- list(a = list(min = -19, max = 20), b = list(min = 22, max = 55), c = list(min = 80, max = 120))
restore <- function(x, r) x * (r$max - r$min) + r$min
my_cols <- c("a", "c")
d %>%
select(!!!my_cols) %>%
map(~restore(.x, l[[name(.x)]]))
# Error in name(.x) : could not find function "name"
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
如何使用 dplyr::select 而不是使用列索引取消选择名为“(Intercept)”的列?
library(dplyr)
library(tibble)
tib<-tribble(~"(Intercept)",~b,
80,3,
80,4,
80,4)
tib[,-1] # works
select(tib,eval(parse(("-(Intercept)")))) # does not work
select(tib,as.name(("-(Intercept)"))) # does not work
select(tib,-"\(Intercept\)") # does not work
Run Code Online (Sandbox Code Playgroud)
谢谢&亲切的问候
我想在向量上使用过滤器列表.我的问题是,filter_list在这个例子中,我如何使用Reduce(或其他基本R标准函数)来执行递归函数正在做的事情(=应用所有函数和逻辑AND连接):
my_vec <- c("AAffff1", "AAafszx223", "AAasfe2XX", "uuse3", "AA232fiserf", "ffse1211", "766", "AA33")
filter_list <- list(
f_1 = function(x) {substr(x, 1, 2) == "AA"},
f_2 = function(x) {grepl("\\d{3,}", x)},
f_3 = function(x) {nchar(x) >= 5})
my_call <- function(fun_list, x) {
if (length(fun_list) == 1) {
fun_list[[1]](x)
} else {
my_call(fun_list[-length(fun_list)], x) & fun_list[[length(fun_list)]](x)
}
}
my_vec[my_call(filter_list, my_vec)]
# [1] "AAafszx223" "AA232fiserf" --> ok
my_vec[Reduce(function(f, ...) f(...), filter_list, my_vec, right = TRUE)]
# character(0) --> wrong
Run Code Online (Sandbox Code Playgroud) 我需要有关提取下划线分隔的第三个元素的正则表达式的帮助。下划线的数量是可变的。我可以使用str_split来做到这一点,但是有没有办法使用str_replace获得与下面相同的结果?(期望的结果是x = AAAA, BBBB, CCCC, DDDD。如果可能,请使用来保持分组()。)
library(tidyverse)
library(stringr)
d <- enframe(c("asfe_01_AAAA_fses_feee",
"asfe_87_BBBB_fses_feee",
"99_fesf_CCCC_feee",
"99_fesf_DDDD"),
name = NULL, value = "txt")
d %>%
mutate(x = str_replace(txt, "(.+)_(.+)_(.+)_*(.*)_*(.*)", "\\3"),
want_strsplit = str_split(txt, "_", simplify = TRUE)[, 3])
#txt x want_strsplit
# <chr> <chr> <chr>
#1 asfe_01_AAAA_fses_feee feee AAAA
#2 asfe_87_BBBB_fses_feee feee BBBB
#3 99_fesf_CCCC_feee feee CCCC
#4 99_fesf_DDDD DDDD DDDD
Run Code Online (Sandbox Code Playgroud) 我想将a转换YYYYMM-integer为Date而不将其转换为character(=是否有类似SAS的mdy函数?).我想替换这段代码:
dateint<-201511
datestr<-paste(toString(dateint,length=8),'01')
date<-as.Date(datestr,'%Y%m%d')
print(date)
class(date)
Run Code Online (Sandbox Code Playgroud)
有一个工作版本.如果可能,结果类也应该是一个日期:
year<-dateint %% 100
month<-floor(dateint/100)
date2<-ISOdate(year,month,1) # I can't make this work ..
print(date2)
class(date2)
Run Code Online (Sandbox Code Playgroud)
谢谢和亲切的问候