使用 seq() 中的值的函数
Function that works with values in a seq()
我有一个 df,我想在其中为每个 id 计算 c 列 < 值的次数。
structure(list(id = c(14, 14, 15, 15, 15, 26, 26, 26, 26), a = c(1,
2, NA, 7, NA, 2, NA, 2, 3), b = c(2, 4, 8, NA, 1, 4, 2, 9, 8),
c = c(2.3, 4.4, 1.3, 5.4, 3, NA, 1, 0, 3)), class = "data.frame", row.names = c(NA,
-9L))
id a b c
1 14 1 2 2.3
2 14 2 4 4.4
3 15 NA 8 1.3
4 15 7 NA 5.4
5 15 NA 1 3.0
6 26 2 4 NA
7 26 NA 2 1.0
8 26 2 9 0.0
9 26 3 8 3.0
我想用我采用的所有阈值的结果制作一个 df。这将导致:
thres_range <- seq(1, 3) # values I want to try as threshold
id thres1 thres2 thres3
1 14 0 0 1
2 15 0 1 1
3 26 1 2 2
我已经得到了计算每个 id 列 c < 值的次数的代码。但是,我无法编写一个函数,将该代码应用于 seq() 中的所有值并将结果放入 1 个数据帧
library(dplyr)
thres_range <- seq(1, 3) # values I want to try as threshold
fun <- function(thres) {
w <- paste0("thres", thres) # give column name e.g. thres2, thres3 etc
df %>% group_by(id) %>%
summarise(w = sum(c < thres, na.rm=TRUE))
}
sapply(thres_range, function(L) fun(L))
如有任何建议,我们将不胜感激!提前致谢! :D
我们用map
遍历'thresh_range',按'id'分组,summarise
到return中的逻辑表达式sum
'w',通过 'id' 在 reduce
中执行 inner_join
,如果需要 rename
列
library(dplyr)
library(purrr)
map(thres_range, ~
df %>%
group_by(id) %>%
summarise(w = sum(c < .x, na.rm = TRUE))) %>%
reduce(inner_join, by = 'id') %>%
rename_at(vars(starts_with('w')), ~ str_c('thresh', seq_along(.)))
# A tibble: 3 x 4
# id thresh1 thresh2 thresh3
# <dbl> <int> <int> <int>
#1 14 0 0 1
#2 15 0 1 1
#3 26 1 2 2
如果我们正在创建一个函数,在带有 =
的 lhs 上的赋值 'w' 将导致计算 'w' 字面上的值而不是内部的值。我们需要
summarise(!! w := sum(c < thresh, na.rm = TRUE))
即
f1 <- function(dat, thresh) {
w <- str_c('thresh', thresh)
dat %>%
group_by(id) %>%
summarise(!! w := sum(c < thresh, na.rm = TRUE))
}
map(thres_range, f1, dat = df) %>%
reduce(inner_join, by = 'id')
我有一个 df,我想在其中为每个 id 计算 c 列 < 值的次数。
structure(list(id = c(14, 14, 15, 15, 15, 26, 26, 26, 26), a = c(1,
2, NA, 7, NA, 2, NA, 2, 3), b = c(2, 4, 8, NA, 1, 4, 2, 9, 8),
c = c(2.3, 4.4, 1.3, 5.4, 3, NA, 1, 0, 3)), class = "data.frame", row.names = c(NA,
-9L))
id a b c
1 14 1 2 2.3
2 14 2 4 4.4
3 15 NA 8 1.3
4 15 7 NA 5.4
5 15 NA 1 3.0
6 26 2 4 NA
7 26 NA 2 1.0
8 26 2 9 0.0
9 26 3 8 3.0
我想用我采用的所有阈值的结果制作一个 df。这将导致:
thres_range <- seq(1, 3) # values I want to try as threshold
id thres1 thres2 thres3
1 14 0 0 1
2 15 0 1 1
3 26 1 2 2
我已经得到了计算每个 id 列 c < 值的次数的代码。但是,我无法编写一个函数,将该代码应用于 seq() 中的所有值并将结果放入 1 个数据帧
library(dplyr)
thres_range <- seq(1, 3) # values I want to try as threshold
fun <- function(thres) {
w <- paste0("thres", thres) # give column name e.g. thres2, thres3 etc
df %>% group_by(id) %>%
summarise(w = sum(c < thres, na.rm=TRUE))
}
sapply(thres_range, function(L) fun(L))
如有任何建议,我们将不胜感激!提前致谢! :D
我们用map
遍历'thresh_range',按'id'分组,summarise
到return中的逻辑表达式sum
'w',通过 'id' 在 reduce
中执行 inner_join
,如果需要 rename
列
library(dplyr)
library(purrr)
map(thres_range, ~
df %>%
group_by(id) %>%
summarise(w = sum(c < .x, na.rm = TRUE))) %>%
reduce(inner_join, by = 'id') %>%
rename_at(vars(starts_with('w')), ~ str_c('thresh', seq_along(.)))
# A tibble: 3 x 4
# id thresh1 thresh2 thresh3
# <dbl> <int> <int> <int>
#1 14 0 0 1
#2 15 0 1 1
#3 26 1 2 2
如果我们正在创建一个函数,在带有 =
的 lhs 上的赋值 'w' 将导致计算 'w' 字面上的值而不是内部的值。我们需要
summarise(!! w := sum(c < thresh, na.rm = TRUE))
即
f1 <- function(dat, thresh) {
w <- str_c('thresh', thresh)
dat %>%
group_by(id) %>%
summarise(!! w := sum(c < thresh, na.rm = TRUE))
}
map(thres_range, f1, dat = df) %>%
reduce(inner_join, by = 'id')