transmute_at 使用 case_when(grepl()) 为多个参数指定列号
transmute_at specified column numbers using case_when(grepl()) for multiple arguments
我一直在寻找这个问题的解决方案,但没有成功。我有一个鱼类数据框,我需要在 27 列数据上应用 dplyr window 函数 (transmute_at
)。数据框子集:
df <- data.frame(
Otherspp = c("suck SD", "BT", "SD RS", "RSS"),
Dominantspp = c("OM", "OM", "RS", "CH"),
Commonspp = c(" ", " ", " ", "OM"),
Rarespp = c(" ", " ", "SD", "NP"),
NP = rep("northern pikeminnow|NORTHERN PIKEMINNOW|np|NP|npm|NPM", 4),
OM = rep("steelhead|STEELHEAD|rainbow trout|RAINBOW TROUT|st|ST|rb|RB|om|OM", 4),
suck = rep("suckers|SUCKERS|sucker|SUCKER|suck|SUCK|su|SU", 4)
)
我需要使用填充有普通鱼的列 codes/names (NP
, OM
, suck
) 计算前四列中的表达式并输出如果满足表达式,则基于每一列的不同数字。到目前为止,我只能弄清楚如何将一列的内容设为 运行。如何为将创建的新列 transmute 和用于计算每个表达式的列在 transmute_at
中索引列名。
这适用于一列:
df <- subset(df[, c(1:4, 6)]) # using column OM for best example
df %>%
rowwise() %>%
transmute(OM = case_when(
grepl(OM, Dominantspp) ~ "5",
grepl(OM, Commonspp) ~ "3",
grepl(OM, Rarespp) ~ "1",
grepl(OM, Otherspp) ~ "1",
TRUE ~ "0"
)
)
提前致谢!
如果我对你的问题的理解正确,你可以执行以下操作。 transmute
类似于 mutate
。不同之处在于 transmute
删除了其他变量。 transmute_at
是 transmute
的变体,它有三个参数。第一个参数是 tbl
或 data frame
。第二个参数 .vars
是 select 列的位置。我们可以使用 vars(...)
来指定列,其中 ...
可以使用与 dplyr::select
相同的方法。第三个参数 .funs
是指定函数以应用于所有 selected 列的地方。我们把操作放在funs(...)
。
library(dplyr)
df %>%
rowwise() %>%
transmute_at(vars(NP, OM, suck),
funs(Recode = case_when(
grepl(., Dominantspp) ~ "5",
grepl(., Commonspp) ~ "3",
grepl(., Rarespp) ~ "1",
grepl(., Otherspp) ~ "1",
TRUE ~ "0"))) %>%
ungroup()
# # A tibble: 4 x 3
# NP_Recode OM_Recode suck_Recode
# <chr> <chr> <chr>
# 1 0 5 1
# 2 0 5 0
# 3 0 0 0
# 4 1 3 0
或者像这样,原始列名后没有任何标签。
df %>%
rowwise() %>%
transmute_at(vars(NP, OM, suck),
funs(case_when(
grepl(., Dominantspp) ~ "5",
grepl(., Commonspp) ~ "3",
grepl(., Rarespp) ~ "1",
grepl(., Otherspp) ~ "1",
TRUE ~ "0"))) %>%
ungroup()
# # A tibble: 4 x 3
# NP OM suck
# <chr> <chr> <chr>
# 1 0 5 1
# 2 0 5 0
# 3 0 0 0
# 4 1 3 0
我一直在寻找这个问题的解决方案,但没有成功。我有一个鱼类数据框,我需要在 27 列数据上应用 dplyr window 函数 (transmute_at
)。数据框子集:
df <- data.frame(
Otherspp = c("suck SD", "BT", "SD RS", "RSS"),
Dominantspp = c("OM", "OM", "RS", "CH"),
Commonspp = c(" ", " ", " ", "OM"),
Rarespp = c(" ", " ", "SD", "NP"),
NP = rep("northern pikeminnow|NORTHERN PIKEMINNOW|np|NP|npm|NPM", 4),
OM = rep("steelhead|STEELHEAD|rainbow trout|RAINBOW TROUT|st|ST|rb|RB|om|OM", 4),
suck = rep("suckers|SUCKERS|sucker|SUCKER|suck|SUCK|su|SU", 4)
)
我需要使用填充有普通鱼的列 codes/names (NP
, OM
, suck
) 计算前四列中的表达式并输出如果满足表达式,则基于每一列的不同数字。到目前为止,我只能弄清楚如何将一列的内容设为 运行。如何为将创建的新列 transmute 和用于计算每个表达式的列在 transmute_at
中索引列名。
这适用于一列:
df <- subset(df[, c(1:4, 6)]) # using column OM for best example
df %>%
rowwise() %>%
transmute(OM = case_when(
grepl(OM, Dominantspp) ~ "5",
grepl(OM, Commonspp) ~ "3",
grepl(OM, Rarespp) ~ "1",
grepl(OM, Otherspp) ~ "1",
TRUE ~ "0"
)
)
提前致谢!
如果我对你的问题的理解正确,你可以执行以下操作。 transmute
类似于 mutate
。不同之处在于 transmute
删除了其他变量。 transmute_at
是 transmute
的变体,它有三个参数。第一个参数是 tbl
或 data frame
。第二个参数 .vars
是 select 列的位置。我们可以使用 vars(...)
来指定列,其中 ...
可以使用与 dplyr::select
相同的方法。第三个参数 .funs
是指定函数以应用于所有 selected 列的地方。我们把操作放在funs(...)
。
library(dplyr)
df %>%
rowwise() %>%
transmute_at(vars(NP, OM, suck),
funs(Recode = case_when(
grepl(., Dominantspp) ~ "5",
grepl(., Commonspp) ~ "3",
grepl(., Rarespp) ~ "1",
grepl(., Otherspp) ~ "1",
TRUE ~ "0"))) %>%
ungroup()
# # A tibble: 4 x 3
# NP_Recode OM_Recode suck_Recode
# <chr> <chr> <chr>
# 1 0 5 1
# 2 0 5 0
# 3 0 0 0
# 4 1 3 0
或者像这样,原始列名后没有任何标签。
df %>%
rowwise() %>%
transmute_at(vars(NP, OM, suck),
funs(case_when(
grepl(., Dominantspp) ~ "5",
grepl(., Commonspp) ~ "3",
grepl(., Rarespp) ~ "1",
grepl(., Otherspp) ~ "1",
TRUE ~ "0"))) %>%
ungroup()
# # A tibble: 4 x 3
# NP OM suck
# <chr> <chr> <chr>
# 1 0 5 1
# 2 0 5 0
# 3 0 0 0
# 4 1 3 0