我一直在寻找解决这个问题的方法,但没有运气。我有一个鱼类数据框,我需要在27列数据上应用 dplyr 窗口函数(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)
)
我需要使用填充了常见鱼码/名称(NP
,OM
,suck
)的列来评估前四列中的表达式并输出不同的数字,如果满足表达式,则基于每个列。到目前为止,我只能弄清楚如何让它运行一列。如何在transmute_at
中为新列transmute创建的列和用于评估每个表达式的列索引列名。
这适用于一列:
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"
)
)
提前致谢!
答案 0 :(得分:4)
如果我理解你的问题,这就是你能做的。 transmute
与mutate
类似。差异是transmute
丢弃其他变量。 transmute_at
是transmute
的变体,有三个参数。第一个参数是tbl
或data frame
。第二个参数.vars
是一个选择列的位置。我们可以使用vars(...)
来指定...
可以使用与dplyr::select
相同的方法的列。第三个参数.funs
是指定要应用于所有选定列的函数的位置。我们将操作设为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