在样本上data.frame:
df <- data.frame(V1 = c(1, 3, 4, NA, NA, 6, 9, NA, 10),
V2 = seq(1:9))
Run Code Online (Sandbox Code Playgroud)
group_by()以这种方式使用filter()会产生以下结果:
df %>%
group_by(miss = !is.na(V1)) %>%
mutate(lag = V1 - lag(V1))
# A tibble: 9 x 4
# Groups: miss [2]
V1 V2 miss lag
<dbl> <dbl> <lgl> <dbl>
1 1. 1. TRUE NA
2 3. 2. TRUE 2.
3 4. 3. TRUE 1.
4 NA 4. FALSE NA
5 NA 5. FALSE NA
6 6. 6. …Run Code Online (Sandbox Code Playgroud) 作为我上一个问题的后续问题,我对提高现有递归采样函数的性能感兴趣。
递归采样是指为给定的暴露 ID 随机选择最多 n 个唯一的未暴露 ID,然后从剩余的未暴露 ID 中随机选择最多 n 个唯一的未暴露 ID 为另一个暴露 ID。如果给定的公开 ID 没有剩余的未公开 ID,则该公开 ID 将被忽略。
原函数如下:
recursive_sample <- function(data, n) {
groups <- unique(data[["exposed"]])
out <- data.frame(exposed = character(), unexposed = character())
for (group in groups) {
chosen <- data %>%
filter(exposed == group,
!unexposed %in% out$unexposed) %>%
group_by(unexposed) %>%
slice(1) %>%
ungroup() %>%
sample_n(size = min(n, nrow(.)))
out <- rbind(out, chosen)
}
out
}
Run Code Online (Sandbox Code Playgroud)
我能够创建一个更有效的,如下所示:
recursive_sample2 <- function(data, n) {
groups <- unique(data[["exposed"]]) …Run Code Online (Sandbox Code Playgroud) 我想从 R 中的字符串中删除多个单词,但想使用字符向量而不是正则表达式。
例如,如果我有字符串
"hello how are you"
Run Code Online (Sandbox Code Playgroud)
并想删除
c("hello", "how")
Run Code Online (Sandbox Code Playgroud)
我会回来
" are you"
Run Code Online (Sandbox Code Playgroud)
我可以近距离接触str_remove()来自stringr
"hello how are you" %>% str_remove(c("hello","how"))
[1] "how are you" "hello are you"
Run Code Online (Sandbox Code Playgroud)
但我需要做一些事情来将其分解为一个字符串。是否有一个函数可以一次调用完成所有这些操作?
我有两列:A 和 B,每列的值从 1 到 7。我需要获得两列之间的最大值,不包括值 7,我该怎么做?或者在 A 有 7 的情况下,我保留 B 的值,这对我更有用,例如:
A <- c(1,1,1,3,2,4,2,5,6,7)
B <- c(7,3,6,7,4,1,6,7,3,4)
df <- data.frame(A, B)
Expected results: 1,3,6,3,4,4,6,5,6,4
Run Code Online (Sandbox Code Playgroud) 这是我的数据框:
categ <- c('a','a','a','b','b')
value <- c(1,2,5,4,5)
df <- data.frame(categ, value)
Run Code Online (Sandbox Code Playgroud)
我想按categ列分组并删除每组中的第一个/最后一个元素。理想情况下,我想创建一个列,指示每个组中的第一个/最后一个元素。这是我尝试过的,但没有奏效:
library('plyr')
ddply(df, .(categ), function(x) x[-nrow(x)])
Run Code Online (Sandbox Code Playgroud)
PS 这可能是重复的问题,但我是 R 的新手,R 非常神秘,所以我无法立即移植解决方案。
我有一个小玩意儿
DF_TEST = tibble('country'=c('a','a','a','a'),
'id'=c(3,3,3,3),
'shop'=c('dmart','dmart','dmart','dmart'),
'beef'=c(23,NA,NA,NA),
'eggs'=c(NA,33,NA,NA),
'fork'=c(NA,NA,10,NA),
'veg'=c(NA,NA,NA,40))
Run Code Online (Sandbox Code Playgroud)
这里的输出为,
country id shop beef eggs fork veg
<chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 a 3 dmart 23 NA NA NA
2 a 3 dmart NA 33 NA NA
3 a 3 dmart NA NA 10 NA
4 a 3 dmart NA NA NA 40
Run Code Online (Sandbox Code Playgroud)
我想通过保留一个侧面 NA 来转换这个 tibble 如下
country id shop beef eggs fork veg
<chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 a 3 dmart …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中包含多个观察值(数量及其名称经常变化)以及最小值和最大值。例子:
ID O1_min O1_max O2_min O2_max O3_min O3_max
A 1 2 1 2 1 2
B 1 2 1 2 1 2
C 1 2 1 2 1 2
D 1 2 1 2 1 2
Run Code Online (Sandbox Code Playgroud)
我想遍历我的数据框,并为每个观察值转换 _range 列中的所有 _min 和 _max 列。所以它看起来像这样:
ID O1_range O2_range O3_range
A 1:2 1:2 1:2
B 1:2 1:2 1:2
C 1:2 1:2 1:2
D 1:2 1:2 1:2
Run Code Online (Sandbox Code Playgroud)
我正在使用paste()函数,但这并不能解决我的问题,一旦新列可以随时进入数据框,我想要一个更自动的代码。
我有一个数据矩阵,每行有不同数量的缺失值.我想要的是如果每行缺失值的数量是N(假设为1),则用行表示替换缺失值.
我已经为这个问题创建了一个解决方案,但它是一个非常不优雅的解决方案,所以我正在寻找其他的东西.
我的解决方案
#SAMPLE DATA
a <- c(rep(c(1:4, NA), 2))
b <- c(rep(c(1:3, NA, 5), 2))
c <- c(rep(c(1:3, NA, 5), 2))
df <- as.matrix(cbind(a,b,c), ncol = 3, nrow = 10)
#CALCULATING THE NUMBER OF MISSING VALUES PER ROW
miss_row <- rowSums(apply(as.matrix(df), c(1,2), function(x) {
sum(is.na(x)) +
sum(x == "", na.rm=TRUE)
}) )
df <- cbind(df, miss_row)
#CALCULATING THE ROW MEANS FOR ROWS WITH 1 MISSING VALUE
row_mean <- ifelse(df[,4] == 1, rowMeans(df[,1:3], na.rm = TRUE), NA)
df <- cbind(df, …Run Code Online (Sandbox Code Playgroud) 我有一个包含3列的数据集.前两列具有以下来自实验的输入值,并且是因子:
col1=[5, 5, 7, 5, 12, 7, 9, 9, 12, 12, 9, 7]
col2=[3.0, 0.5, 1.0, 1.0, 0.5, 0.5, 1.0, 0.5, 1.0, 3.0, 3.0, 3.0]
Run Code Online (Sandbox Code Playgroud)
这些组合的结果中的第三列:
col3=[1.435078, 1.161110, 3.012732, 1.341047, 1.299615, 2.718960, 3.913285, 2.064090, 1.261958, 1.158850, 3.079639, 2.579303]
Run Code Online (Sandbox Code Playgroud)
我想要的是使用表格左侧的单个column2值和表格上方的列1值来显示数据,并且列3的值与两个因子的交集处显示的每个唯一因子组合相关.理想情况下,这看起来像这样:
| | 5 | 7 | 9 | 12 |
|-----|------|------|------|------|
| 0.5 | 1.16 | 2.72 | 3.91 | 1.30 |
| 1.0 | 1.34 | 3.01 | 2.06 | 1.26 |
| 3.0 | 1.43 | 2.58 | 3.08 …Run Code Online (Sandbox Code Playgroud) 假设data.frame如下:
df <- read.table(text = "ID Date Condition
1 2015/01/01 Yes
1 2015/01/10 No
1 2015/01/15 Yes
2 2015/02/10 No
2 2015/03/08 No
3 2015/01/01 No
3 2015/04/01 Yes
3 2015/04/10 No
3 2015/04/01 Yes
3 2015/04/10 No", header = TRUE)
Run Code Online (Sandbox Code Playgroud)
我想分别计算每个ID的给定日期和第一个日期之间的天数.现在,对于条件始终为"No"的每个ID,我想在列中分配NA以显示结果.
这是我的代码:
df %>%
mutate(Date = as.Date(Date, "%Y/%m/%d")) %>%
group_by(ID) %>%
mutate(Temp = Date - first(Date),
Res1 = ifelse(all(Condition == "No"), NA, Temp),
Res2 = if(all(Condition == "No")) NA else Temp)
Run Code Online (Sandbox Code Playgroud)
结果:
ID Date Condition Temp Res1 Res2
<int> …Run Code Online (Sandbox Code Playgroud) 假设这样的df:
df <- data.frame(id = c(rep(1:5, each = 2)),
time1 = c("2008-10-12", "2008-08-10", "2006-01-09", "2008-03-13", "2008-09-12", "2007-05-30", "2003-09-29","2003-09-29", "2003-04-01", "2003-04-01"),
time2 = c("2009-03-20", "2009-06-15", "2006-02-13", "2008-04-17", "2008-10-17", "2007-07-04", "2004-01-15", "2004-01-15", "2003-07-04", "2003-07-04"))
id time1 time2
1 1 2008-10-12 2009-03-20
2 1 2008-08-10 2009-06-15
3 2 2006-01-09 2006-02-13
4 2 2008-03-13 2008-04-17
5 3 2008-09-12 2008-10-17
6 3 2007-05-30 2007-07-04
7 4 2003-09-29 2004-01-15
8 4 2003-09-29 2004-01-15
9 5 2003-04-01 2003-07-04
10 5 2003-04-01 2003-07-04
Run Code Online (Sandbox Code Playgroud)
我尝试做的是,首先lubridate在变量“ time1”和“ time2”之间创建一个间隔。其次,我要按“ …
假设df缺少一些像这样的值:
ID col_A_1 col_A_2 col_B_1 col_B_2
1 1 1 NA NA a
2 1 2 NA 1 b
3 1 3 1 2 c
4 1 4 2 3 d
5 1 NA 3 4 e
6 2 NA 1 5 f
7 2 NA 2 6 g
8 2 1 3 7 h
9 2 2 4 8 <NA>
10 2 3 5 NA <NA>
Run Code Online (Sandbox Code Playgroud)
我只想使用tidyr fill()包含的列中的缺失值来填充缺失值A。
我能够使用以下方法实现它:
library(dplyr)
library(tidyr)
df %>%
group_by(ID) %>%
fill(names(.)[grepl("A", …Run Code Online (Sandbox Code Playgroud) Assume a string vector like this:
x <- c("abc", "abcde", "abcde123")
Run Code Online (Sandbox Code Playgroud)
I want to add a separator (a comma or whatever) between every element of a given string to achieve something like this (here the separator is a comma):
[1] "a,b,c" "a,b,c,d,e" "a,b,c,d,e,1,2,3"
Run Code Online (Sandbox Code Playgroud)
I am able to achieve it with:
sapply(strsplit(x, "", fixed = TRUE), function(x) paste(x, collapse = ","))
Run Code Online (Sandbox Code Playgroud)
however, I am curious whether there is a different way to achieve it.