R 如何根据字符串模式将数据帧的所有列拆分为不同的组,并将函数应用于每组列?
我想创建类似于b_none、c_none等列。在发布这个问题时,我有了一个循环的想法,并得到了答案。我还要补充一点R 如何根据字符串模式将数据帧的所有列拆分为不同的组,并将函数应用于每组列?,r,dplyr,tidyverse,apply,R,Dplyr,Tidyverse,Apply,我想创建类似于b_none、c_none等列。在发布这个问题时,我有了一个循环的想法,并得到了答案。我还要补充一点 library(glue) library(tidyverse) data = crossing(id = c(1:4),q = letters[1:5], nums = c(1:10)) set.seed(25) data$val = sample(c(NA,"foo", "bar"), nrow(data), prob = c(0.95
library(glue)
library(tidyverse)
data = crossing(id = c(1:4),q = letters[1:5], nums = c(1:10))
set.seed(25)
data$val = sample(c(NA,"foo", "bar"), nrow(data), prob = c(0.95,0.02,0.03), replace = T)
data = data %>% mutate(q = glue("{q}{nums}")) %>%
select(-nums) %>%
pivot_wider(id_cols = id, names_from = q, values_from = val)
#Output Im looking for
data %>%
select(id,starts_with("a")) %>%
mutate(
a_none = apply(.[,grep("a", names(.))], 1, function(x) all(is.na(x)))
)
这个for循环为我完成了任务。还有更好的主意吗
我尝试使用
dput()
插入输出,但失败。您可以使用split。默认值根据相似的命名列拆分数据帧,并使用imap
frompurr
获取每个组的逻辑值
for (pattern in letters[1:5]) {
varname = glue("{pattern}_none")
data[[varname]] = apply(data[,grep(pattern, names(data))], 1, function(x) all(is.na(x)))
}
library(dplyr)
library(purrr)
result <- split.default(data[-1], sub('\\d+', '', names(data)[-1])) %>%
imap_dfc(~.x %>% transmute(!!paste0(.y, '_none') := rowSums(!is.na(.)) == 0))
result
# a_none b_none c_none d_none e_none
# <lgl> <lgl> <lgl> <lgl> <lgl>
#1 FALSE FALSE TRUE TRUE FALSE
#2 TRUE TRUE TRUE TRUE TRUE
#3 FALSE TRUE TRUE TRUE FALSE
#4 FALSE TRUE TRUE FALSE FALSE
data <- bind_cols(data, result)
sapply(split.default(data[-1], sub('\\d+', '', names(data)[-1])),
function(x) rowSums(!is.na(x)) == 0)