假设我有一个x包含n元素的向量。我想使用任何矢量化函数,比如说cumprod,在 的每个备用数上x,即每 1、3、5 等等,以及 2、4、6 等等。我正在添加一个 reprex 并尝试了代码。该代码有效,但似乎我不必要地走了很长的路,并且可以缩短代码。是真的吗?
x <- 5:14
cumprod((x * (seq_along(x) %% 2)) + (seq_along(x)-1) %% 2) * seq_along(x) %% 2 +
cumprod((x * ((seq_along(x)-1) %% 2)) + seq_along(x) %% 2) * (seq_along(x)-1) %% 2
#> [1] 5 6 35 48 315 480 3465 5760 45045 80640
Run Code Online (Sandbox Code Playgroud)
这里cumprod只是一个示例函数。我可能还必须以交替顺序使用其他功能。
假设我有数据test(给定的 dput),其中 list-col 说items:
test <- structure(list(items = list('a', c('b', 'c'), c('d', 'e'), 'f', c('g', 'h')),
ID = c(1,1,1,2,2)), row.names = c(NA, 5L), class = "data.frame")
library(tidyverse)
test %>% group_by(ID) %>%
mutate(dummy = accumulate(items, ~paste(.x, .y)))
Run Code Online (Sandbox Code Playgroud)
我得到一个像这样的 list-col 输出
items ID dummy
1 a 1 a
2 b, c 1 a b, a c
3 d, e 1 a b d, a c e
4 f 2 f
5 g, h 2 f g, f h …Run Code Online (Sandbox Code Playgroud) ''当遇到空值时,如何将以下向量拆分为包含每个新元素的列表?
例如给定以下输入 -
x <- c("abc", "", "a", "b", "c", "", "ab", "ac", "", "a", "a", "a",
"a", "", "b")
x
[1] "abc" "" "a" "b" "c" "" "ab" "ac" "" "a" "a" "a" "a" "" "b"
Run Code Online (Sandbox Code Playgroud)
我想要以下列表作为输出
list("abc", c("a", "b", "c"), c("ab", "ac"), c("a", "a", "a",
"a"), "b")
[[1]]
[1] "abc"
[[2]]
[1] "a" "b" "c"
[[3]]
[1] "ab" "ac"
[[4]]
[1] "a" "a" "a" "a"
[[5]]
[1] "b"
Run Code Online (Sandbox Code Playgroud) 我正在处理这样的数据:
> df
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 1 0 0 0 1 1 0 0 1 1
2 1 1 1 0 0 0 0 1 0 1
3 1 1 0 0 1 0 0 1 0 1
4 1 0 0 0 0 0 0 1 1 1
5 0 0 0 1 0 0 1 1 1 1
6 0 0 1 1 0 0 1 0 1 0
Run Code Online (Sandbox Code Playgroud)
dput(df) …
我正在寻找正则表达式(最好是 in R),它可以用 say 替换(任意数量的)特定字符;say;;但仅当文本字符串内的括号内不存在时()。
注意: 1. 括号内也可能存在多个替换字符
2.数据/向量中没有嵌套括号
例子
text;othertext 替换为 text;;othertexttext;other(texttt;some;someother);more要替换为text;;other(texttt;some;someother);;more. (即;仅在外部()被替换文本替换)如果需要澄清,我会尝试解释
in_vec <- c("abcd;ghi;dfsF(adffg;adfsasdf);dfg;(asd;fdsg);ag", "zvc;dfasdf;asdga;asd(asd;hsfd)", "adsg;(asdg;ASF;DFG;ASDF;);sdafdf", "asagf;(fafgf;sadg;sdag;a;gddfg;fd)gsfg;sdfa")
in_vec
#> [1] "abcd;ghi;dfsF(adffg;adfsasdf);dfg;(asd;fdsg);ag"
#> [2] "zvc;dfasdf;asdga;asd(asd;hsfd)"
#> [3] "adsg;(asdg;ASF;DFG;ASDF;);sdafdf"
#> [4] "asagf;(fafgf;sadg;sdag;a;gddfg;fd)gsfg;sdfa"
Run Code Online (Sandbox Code Playgroud)
预期输出(手动计算)
[1] "abcd;;ghi;;dfsF(adffg;adfsasdf);;dfg;;(asd;fdsg);;ag"
[2] "zvc;;dfasdf;;asdga;;asd(asd;hsfd)"
[3] "adsg;;(asdg;ASF;DFG;ASDF;);;sdafdf"
[4] "asagf;;(fafgf;sadg;sdag;a;gddfg;fd)gsfg;;sdfa"
Run Code Online (Sandbox Code Playgroud) 我根据列名将 data.frame 拆分为一个列表。我想要的是将 id 列 ( id) 不仅包含在一个项目中,而且包含在结果列表的所有元素中。
目前我正在通过随后将id列绑定到列表的所有项目map和bind_cols(通过Map/ do.call/mapply等替代。我自己也可以这样做)。我想知道的是有什么直接的规范方法可以直接执行此操作,可能直接使用split.default其他函数的函数参数或直接通过其他函数,从而节省两三个额外步骤。
可重现的例子
df <- data.frame(
stringsAsFactors = FALSE,
id = c("A", "B", "C"),
nm1_a = c(928L, 476L, 928L),
nm1_b = c(61L, 362L, 398L),
nm2_a = c(965L, 466L, 369L),
nm2_b = c(240L, 375L, 904L),
nm3_a = c(429L, 730L, 788L),
nm3_b = c(99L, 896L, 540L),
nm3_c = c(463L, 143L, 870L)
)
df
#> id nm1_a nm1_b nm2_a nm2_b …Run Code Online (Sandbox Code Playgroud) 这听起来可能是一个非常初学者的问题,而且它也可能是一个非常基本和愚蠢的问题,但不知何故,我在做这件事时感到头疼。
假设我有一个单项列表
v <- as.list("1, 2, 3,")
v
[[1]]
[1] "1, 2, 3,"
Run Code Online (Sandbox Code Playgroud)
现在我想将其所有项目拆分为单独的项目
v2 <- lapply(str_split(v, pattern = ","), trimws)
v2
[[1]]
[1] "1" "2" "3" ""
Run Code Online (Sandbox Code Playgroud)
现在我想""从这个列表的第一个也是唯一一个项目中删除它而不使用[]?
我有一些随时间收集的变量。tibble 的一个非常简化的版本看起来像这样。
df = tribble(
~id, ~varA.t1, ~varA.t2, ~varB.t1, ~varB.t2,
'row_1', 5, 10, 2, 4,
'row_2', 20, 50, 4, 6
)
Run Code Online (Sandbox Code Playgroud)
我想系统地创建一组新的变量,varC以便varC.t#= varA.t#/ varB.t#where#是 1、2、3 等(类似于在上面的 tibble 中设置列名的方式)。
我如何使用类似mutate或 的东西across来做到这一点?
我有以下数据框:
df <- tribble(~ id, ~ lon, ~ lat,
1, -56.2112038, -34.8358207,
2, -55.96403429999999, -34.7260945,
3, -56.155449, -34.9030824,
4, -55.2711453, -34.8665964,
5, -56.210083, -34.865306,
6, -56.0575984, -34.8775368,
7, -54.9485448, -34.9260087,
8, -56.146228, -34.907991,
9, -56.1953583, -34.8643363,
10, -56.1821508, -34.8697975,
11, -56.1498662, -34.8849854,
12, -56.1469807, -34.9119864,
13, -56.155763, -34.9154153,
14, -56.09861610000001, -34.8896448,
15, -56.15526680000001, -34.9189892,
16, -56.0582918, -34.8873091,
17, -54.9529404, -34.9221666,
19, -106.6971588, -35.1366719,
20, -56.1616095, -34.8937622)
Run Code Online (Sandbox Code Playgroud)
我想要实现的是添加一个新列,说明在彼此相距 250 米的半径/距离内有多少个 ID。这个想法是取一行,“查看”坐标,看看该点是否在其他 id 的 250 米半径内以及它们中有多少。
我有 R 中一位患者的数据,其中显示了他们在某种情况下测试呈阳性的日期。数据如下所示:
date positive
2005-02-22 yes
2005-04-26 no
2005-08-02 yes
2005-10-04 no
2005-12-06 yes
2006-03-14 no
2006-06-06 no
2006-09-12 yes
2006-12-19 yes
2007-03-27 yes
Run Code Online (Sandbox Code Playgroud)
现在我介绍一个新的定义。如果“当前测试为阳性,并且在之前 365 天内>=50% 的测试为阳性”,则将患者的状况定义为“慢性阳性”。所以我想创建一个输出数据集,告诉我患者在每个日期是否长期呈阳性。例如,输出应如下所示(例如,在 2006-09-12 上,它们是“阳性”但不是“慢性阳性”,因为在过去 365 天内的 4 次访问中有 3 次是阴性的):
date positive chronic
2005-02-22 yes no
2005-04-26 no no
2005-08-02 yes yes
2005-10-04 no no
2005-12-06 yes yes
2006-03-14 no no
2006-06-06 no no
2006-09-12 yes no
2006-12-19 yes no
2007-03-27 yes yes
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?在感兴趣的每一行中,我需要能够查看之前的行(在过去 365 天内)并评估它们的阳性比例。我想我可以使用lead/lag …